home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / jx4nt123.zip / DOC / JAX4TH.DOC
Text File  |  1994-09-05  |  90KB  |  2,195 lines

  1. Jax4th for Windows NT is Copyright 1993, 1994
  2. by Jack J. Woehr, PO Box 51, Golden, CO 80402-0051
  3. jax@well.sf.ca.us 72203.1320@compuserve.com SYSOP RCFB (303) 278-0364
  4. All Rights Reserved.
  5. NOTE: This document is formatted to a maximum of 120 characters per line.
  6. With a 640x480 display, Alan Phillips's PFE editor for NT using the screen
  7. font Lucida Sans Typewriter 7 is best for viewing.
  8.  
  9. The Gnu Public License is Copyright (C) 1988, 1990, 1991, 1992, 1993
  10. Free Software Foundation, Inc.
  11.  
  12. *********************************************************************
  13. This program is free software; you can redistribute it and/or modify
  14. it under the terms of the GNU General Public License as published by
  15. the Free Software Foundation; either version 2 of the License, or
  16. (at your option) any later version.
  17.  
  18. This program is distributed in the hope that it will be useful,
  19. but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21. GNU General Public License for more details. (see COPYING.TXT)
  22.  
  23. You should have received a copy of the GNU General Public License
  24. along with this program; if not, write to the Free Software
  25. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26. *********************************************************
  27.  
  28.     ***For a Quick Start, see the "Invoking Jax4th" section below in this document.***
  29.  
  30. PRELIMINARY DOCUMENTATION -- to be finished Real Soon Now :-)
  31. -------------------------------------------------------------
  32.     This preliminary documentation file is still undergoing revision, as is the Jax4th system itself. This
  33. documentation is not yet complete, but attempts in as far as it is complete to conform to the documentation
  34. requirements imposed by the ANS/ASC X3/X3J14 Technical Committee's draft proposed Standard for Forth (ANSI/IEEE
  35. X3.215-199x) in Chapter Four "Documentation Requirements" of that draft. Actually, the Glossary is the only
  36. major part of the documentation which remains unfinished. The Glossary is at the end of this document.
  37.  
  38.     - To be kept up-to-date on Jax4th, see the heading "OPTIONAL SHAREWARE REGISTRATION" below.
  39.  
  40.     - For information on Jax4th's TOTAL LACK OF WARRANTY, see the Gnu Public License in the file LICENSE.TXT in
  41. the distribution archive in which your received this file. If you did not receive the license, you do not have a
  42. licensed copy of Jax4th.
  43.  
  44.     - For information on your license to use and right to distribute this free system, see Gnu Public License,
  45. vide infra (how's *that* for lawyer talk?!).
  46.  
  47.     - For information on X3J14 and the draft proposed Standard, contact the X3J14 Technical Committee, c/o
  48.       Elizabeth Rather, Chair, 111 N. Sepulveda Blvd., Suite 300, Manhattan Beach, CA 90266.
  49.  
  50. Welcome to Jax4th for Windows NT Version 1.x!
  51. ---------------------------------------------
  52.     Jax4th is a minimal model Forth system. The design goals are as follows:
  53.  
  54.     1) Provide a fun freeware Forth for Windows NT which is as complete, usefula and easy to use as is practical
  55. in the limited amount of time the author has to develop and maintain it.
  56.  
  57.     2) Provide a Forth as described above which emphasizes the model promulgated by the ANS/ASC X3/X3J14 Technical
  58. Committe for ANS Forth.
  59.  
  60.     LATE NOTE: As Elizabeth Rather, Chair of X3J14 posted on USENET April 19, 1994:
  61.  
  62.     "I'm happy to inform you that, according to Lynn Barra of X3, the ANSI BSR 
  63.     letter ballot for final approval of ANS Forth passed.  Lynn believes they 
  64.     will take about 2 mos. to publish the document, and will issue a press 
  65.     release when it is ready."
  66.  
  67.     For a Quick Start, see the "Invoking Jax4th" section below in this document.
  68.  
  69. What Jax4th is Not
  70. ------------------
  71.     Jax4th is not an optimizing compiler targeted at professional development. The author did not dream of
  72. providing in two hundred (200) hours of his time a freeware Forth to compete with professional systems which required
  73. thousands of hours of programmer time to complete. For a professional Forth development environment for Windows 3.1 or
  74. for Windows NT, please contact a Forth vendor, for instance, one of the organizations listed below (in alphabetical
  75. order):
  76.  
  77.     FORTH, Inc.
  78.     111 N. Sepulveda Blvd.
  79.     Manhattan Beach, CA 90266
  80.     1-800-55-FORTH
  81.     
  82.     Laboratory Microsystems, Inc. (LMI)
  83.     P.O. Box 10430
  84.     Marina del Rey, CA 90295
  85.     1-310-306-7412
  86.  
  87.     Microprocessor Engineering, Ltc. (MPE)
  88.     133 Hill Lane
  89.     Surrey, Southampton SO1 5AF
  90.     England
  91.     +011-44-703-631441
  92.  
  93. About Forth
  94. -----------
  95.     The author of Jax4th has written two books on Forth:
  96.  
  97.      _Forth: The New Model_, Jack Woehr M&T Publishing, 1992, ISBN 1-55851-277-2 (about dpANS-Forth);
  98.      _Seeing Forth_, Jack Woehr, Offete Enterprises, 1992 (about Forth history and philosophy).
  99.  
  100.     Both of these books, as well as many others by many other fine Forth authors, may be mail-ordered from:
  101.  
  102.         The Forth Interest Group
  103.         P.O. Box 2154
  104.         Oakland, CA 94621
  105.         1-510-89-FORTH
  106.  
  107. DISCLAIMERS
  108. -----------
  109.     1) JaxFamousFreewareDisclaimer:
  110.  
  111.      ******************************************************************
  112.     * NO WARRANTY NO GUARANTEE NO SOAP RADIO, YER' ON YER OWN, SIS/BUB! *
  113.      ******************************************************************
  114.  
  115.     2) All trademarks mentioned herein are the property of their owners. The owners are so obvious as not to bear
  116. mentioning, as in "Windows NT is a trademark of Microsoft". Duh.
  117.  
  118.     3) The draft proposed Standard for Forth is the work of the ANS/ASC X3/X3J14 Technical Committee, a committee
  119. accredited to CBEMA and the American National Standards Institute. Please note that when the phrase "ANS Forth" appears,
  120. it refers to the model of Forth which will result from the X3J14 Technical Committee's deliberations, once promulgated
  121. by the American National Standards Institute. The draft was recently reported as having been passed by X3, see note above.
  122.  
  123. LICENSE & DISTRIBUTION
  124. ----------------------
  125.     Jax4th is licensed under the GNU public license.
  126.  
  127.     For information on the GNU public license, read the file LICENSE.TXT or please contact the Free Software
  128. Foundation, Inc., 675 Mass. Ave., Cambridge, MA 02139.
  129.  
  130.     This free software is not warrantied or guaranteed in any fashion. I just happen to like it ...
  131.  
  132. OPTIONAL SHAREWARE REGISTRATION
  133. -------------------------------
  134.     Jax4th is GNU-style Freeware, but if you send a $25.00 donation to the author:
  135.  
  136.     Jack Woehr
  137.     PO Box 51
  138.     Golden, CO 80402-0051
  139.  
  140.     accompanied by an internet email address, you will be kept posted on major upgrades (including later additions
  141. to this documentation!!) via UUENCODEd .ZIP files. Your registration will last for one (1) year from the date it is
  142. received. PLEASE SEND U.S. CHECK OR MONEY ORDER ONLY ... NO CASH NO CREDIT CARDS NO FOREIGN CHECKS.
  143.  
  144.     Your donation is entirely voluntary, since from time to time I will post these same files to public download
  145. sites. Your donation simply expresses respect for the author and adds to your convenience in keeping up with upgrades
  146. to this model Forth system. Since your donation is voluntary, no extension of Jax4th's complete NON-WARRANTY is
  147. effected by such donation: JAX4TH IS NEVER SOLD.
  148.  
  149.     All tech support is currently provided via the RCFB BBS (303) 278-0364. (J)oin JAXWARE when you are there.
  150. No tech support is promised for this free software, but it's my BBS, so I'll be there maybe.
  151.  
  152. Invoking Jax4th
  153. ----------------
  154.     Doubleclick on JAX4TH.EXE in File Manager, or doubleclick the Jax4th icon in a program
  155. group or icon bar to start Jax4th for Windows NT.
  156.  
  157.     Alternatively type JAX4TH to start the system. Any other valid Forth commands entered
  158. on the command line will be executed before the Jax4th logo is displayed and QUIT is performed.
  159. If you have a saved dictionary, e.g., FOO.DIC, you may reload it on the command line and execute
  160. commands from it
  161.  
  162.     C:\>jax4th RELOAD FOO.DIC MY-WORD BYE
  163.  
  164. for example.
  165.  
  166.     Use CAPS LOCK ON since Jax4th's interpreter is case sensitive and most system words are in UPPERCASE.
  167.  
  168.     JAX4TH gives you a compiler/interpreter with no mass storage facilities. User dictionary is 32K, data space is
  169. 32K. Both will overflow silently if exhausted.
  170.  
  171. Saving a Dictionary
  172. -------------------
  173.     You may compile code and then save the resultant dictionary image for later reloading.
  174. To save, type SAVE-FORTH, which brings up a requester for a "save file as" name. BUG: The requester
  175. doesn't always come to front, you may have to go look for it behind your window! Choose a filename
  176. and click "OK" and your dictionary will be saved for a later reload without recompilation.
  177.  
  178.     LIMITATION: Don't SAVE-FORTH with any wordlists in the search order or current compilation
  179. wordlist EXCEPT those from among the predefined system wordlists: FORTH-WORDLIST INTERNALS-WORDLIST
  180. SYSTEM-WORDLIST and NONSTANDARD-WORDLIST. Instead, your program should set the search order 
  181. ynamically at runtime.
  182.  
  183. See: SAVE-FORTH RELOAD RELOAD-FILE RELOADED
  184.  
  185. Recompilation of Jax4th
  186. -----------------------
  187.     To compile Jax4th from the sources provided you will need:
  188.  
  189.         - Microsoft MASM 6.11 or later (thanx for the beta, Microsoft!)
  190.  
  191.     For compiling Jax4th for Windows NT:
  192.  
  193.         - The Windows NT SDK and a 32 bit linker, such as LINK32 from the beta NT SDK.
  194.  
  195.     A Makefile for NMAKE is provided.
  196.         
  197. Standard System
  198. ---------------
  199.     Jax4th is a model system conforming to the current state of the draft proposed Standard Forth
  200. (ANSI/IEEE X3.215-199x) to the best of the author's understanding.
  201.  
  202.     The following dpANS word sets are provided in their entirety:
  203.  
  204.         Core
  205.         Block
  206.         Exception-Handling
  207.         Memory-Allocation (*note: Memory-Allocation wordset provided in loadable source form.)
  208.         Search-Order
  209.  
  210.     The following wordsets are substantially provided in Jax4th with some non-conformance noted later in this
  211. document:
  212.  
  213.         File-Access
  214.         String
  215.  
  216.     Selected words from the following wordsets are present in Jax4th:
  217.  
  218.         Core Extensions
  219.         Double-Number (and Extensions)
  220.         Facility
  221.         Programming-Tools
  222.  
  223.     The following word sets are not supported at all in the current revision of Jax4th. Some may be supported or
  224. partially supported in future revisions:
  225.  
  226.         Floating-Point
  227.         Locals
  228.  
  229. See the Glossary later in this document for more information.
  230.  
  231. General Implementation Options
  232. ----------------------
  233.     Aligned address requirements:
  234.         ALIGN aligns the dataspace to longword (4 bytes) boundaries. In general, the system is thus aligned,
  235.     though as regards the dictionary (as opposed to data space) this should be transparent to the user. See,
  236.     however, "Character-aligned address requirements" below.
  237.  
  238.     Behavior of EMIT for non-displayable values:
  239.         The Unicode support for the Windows NT Console tends to display question marks ("?") for non-printable
  240.     values.
  241.  
  242.     Character-aligned address requirements:
  243.         Jax4th characters are Unicode, and must be word (2 byte) aligned. See also: ASCIIZ and UNICODE in the
  244.     "Glossary" later in this document. Also, see "File Handling, ASCII and Unicode" later in this document.
  245.  
  246.     Character editing of ACCEPT:
  247.         The line-editing performed by Jax4th ACCEPT is provided by the Windows NT Console. DOSKEY-based
  248.     command-line edits and recall via the arrow keys is supported.
  249.  
  250.     Control-flow stack:
  251.         The data stack is the control-flow stack. No type checking on control structure information is
  252.     performed.
  253.  
  254.     User output device:
  255.         The user output device is the Windows NT Console.
  256.  
  257.     Display after return of ACCEPT:
  258.         The NT Console emits a CR/LF pair when the user terminates ACCEPT.
  259.  
  260.     Exception abort sequence:
  261.         ABORT and ABORT" are implemented in terms of CATCH/THROW. At powerup, an initial CATCH frame is pushed
  262.     on the exception stack which catches stray THROWs that are not caught by application code. When such THROWs are
  263.     caught, the exception stack is re-initialized as before.
  264.  
  265.         The exception stack is implemented on the return stack.
  266.  
  267.         Certain THROWs are recognized and the default handler for the system CATCH frame prints a message
  268.     associated with them. If a THROW hits the system CATCH frame and the THROW number is not recognized, a message
  269.     indicating the THROW number and the address at which it occurred is printed.
  270.  
  271.         In the case of ABORT, no message is printed, but the following actions occur:
  272.  
  273.             - The initial CATCH frame is restored.
  274.             - The return stack is cleared.
  275.             - The data stack is cleared.
  276.             - The input stream is restored to the default console input and emptied.
  277.             - The STATE of the system is restored to "interpreting".
  278.  
  279.         Additionally, in the case of ABORT" the user-supplied message string is displayed.
  280.  
  281.     Input return key:
  282.         The input return key is the Enter key.
  283.  
  284.     Maximum size of counted string:
  285.         65,535 characters.
  286.  
  287.     Maximum size of a word name:
  288.         126 characters.
  289.  
  290.     Maximum string length for ENVIRONMENT?:
  291.         65,535 characters.
  292.  
  293.     Method of selection of user input device:
  294.         There is a deficiency in Windows NT Console support for Unicode. WriteFile() doesn't support Unicode
  295.     to console handles. WriteConsole() doesn't support redirection of console I/O. The result is either Unicode
  296.     or no command line redirection of I/O for Jax4th. The author chose Unicode; therefore, there is no redirection
  297.     of console I/O for Jax4th.
  298.  
  299.     Method of use of return stack during compilation:
  300.         The return stack is not used in any special manner during compilation.
  301.  
  302.     Methods of dictionary compilation:
  303.         The data stack is the control flow stack.
  304.  
  305.         A name is not linked into the compilation wordlist until the name's definition is complete. A colon
  306.     definition will not be completed if the data stack depth has changed since the definition was commenced.
  307.  
  308.         There is no type checking performed on control flow construct information.
  309.  
  310.         There is no warning for name redefinition.
  311.  
  312.         Compilation occurs in the user dictionary, which is in a separate address space from the kernel
  313.     dictionary. Any execution token returned by ' ("tick") may be converted to a data-relative address via
  314.     the word TOKENTODATA.
  315.  
  316.     Methods of memory space management:
  317.         Data space is separate from dictionary space and commences at a relative address of zero. A data
  318.     space address must be converted to an absolute address via DATATOABS (q.v., Glossary) before passing such
  319.     to a Windows NT system call.
  320.  
  321.         Any Windows NT memory allocation operation will return an absolute addres which must be converted to a
  322.     data-relative address before operating upon it with ! or @ etc. via ABSTODATA.
  323.  
  324.         See also: ABSTOCODE CODETOABS CODETODATA DATATOCODE TOKENTODATA in the Glossary.
  325.  
  326.     Minimum search order:
  327.         There are four (4) wordlists in the Jax4th kernel:
  328.  
  329.             FORTH-WORDLIST        all the standard Forth words in the Jax4th system.
  330.             NONSTANDARD-WORDLIST    some familiar, some new, but all nonstandard Forth words.
  331.             SYSTEM-WORDLIST        special words the user needs to interface Jax4th to the host OS.
  332.             INTERNALS-WORDLIST    low-level words used internally, most not of direct use to the programmer.
  333.  
  334.     (toti q.v., Glossary). The minimum search order is FORTH-WORDLIST, but the bootup default is FORTH-WORDLIST
  335.     NONSTANDARD-WORDLIST SYSTEM-WORDLIST in that order. INTERNALS-WORDLIST is interesting, but not generally
  336.     useful to the programmer, so it is not placed in the search order by default.
  337.  
  338.     Number of bits in one address unit:
  339.         A Jax4th address unit is a byte, eight (8) bits.
  340.  
  341.     Number representation:
  342.         Two's complement.
  343.  
  344.     Ranges for:
  345.         Type        Low        High
  346.         ----        ---        ----
  347.         n        -2^31        (2^31)-1
  348.         +n        0        (2^31)-1
  349.         u        0        (2^32)-1
  350.         d        -2^63        (2^63)-1
  351.         +d        0        (2^63)-1
  352.         ud        0        (2^64)-1
  353.  
  354.     Read-only data space regions:
  355.         The kernel, the user dictionary, and runtime data space loaded by Jax4th may be read. Aside from this
  356.     space, only readable allocations made by the user via the Jax4th facility to perform Windows NT system calls
  357.     may be read. All other memory is not readable, albeit addressable.
  358.  
  359.     Size of one cell in address units:
  360.         4 address units.
  361.  
  362.     Size of one character in address units:
  363.         2 address units.
  364.  
  365.     Size of keyboard terminal input buffer:
  366.         256 characters.
  367.  
  368.     Size of the pictured numeric output string buffer:
  369.         128 characters.
  370.  
  371.     Size of PAD:
  372.         128 characters.
  373.  
  374.     System prompt:
  375.         The characters
  376.  
  377.             ok
  378.  
  379.         followed by the depth of the data stack represented in the current numeric base form the system prompt.
  380.  
  381.     Type of division:
  382.         The default division algorithm is "symmetrical about zero".
  383.  
  384.     Values returned after arithmetic overflow:
  385.         Undefined.
  386.  
  387.     The current definition may not be found immediately after DOES> until the semicolon (";") which matches the
  388.     colon (":") which commenced the current definition is encountered by the text interpreter.
  389.  
  390. Wordset-specific Implementation Options
  391. ---------------------------------------
  392. BLOCK:
  393.  
  394.     Format of LIST:
  395.         Traditional 16 x 64 screen display with header and line numbers on each side.
  396.         Also, file id is displayed at top of screen.
  397.  
  398.     Length of line affected by \:
  399.         To end of 64-character line.
  400.  
  401. DOUBLE:
  402.  
  403.     None.
  404.  
  405. EXCEPTION:
  406.  
  407.     List of Throw Codes:
  408.         Many Jax4th words will THROW a throw code on encountering an error. That THROW will be
  409.     trapped by a system CATCH unless caught by a user CATCH. The system CATCH either prints
  410.     a specific message, or returns the number of the THROW. Jax4th does not necessarily
  411.     trap all error conditions specified below.
  412.  
  413. -1 ABORT
  414. -2 ABORT"
  415. -3 stack over
  416. -4 stack under
  417. -5 ret stack over
  418. -6 ret stack under
  419. -7 too many DO .. LOOPs
  420. -8 dictionary space exhausted
  421. -9 invalid memory address
  422. -10 divide by zero
  423. -11 result overflow/underflow
  424. -12 wrong arg type
  425. -13 word not found
  426. -14 compile-only
  427. -15 bogus FORGET
  428. -16 empty string used for name
  429. -17 numeric output string too long
  430. -18 parsed string too long
  431. -19 name too long
  432. -20 illegal memory write
  433. -21 unsupported operation
  434. -22 control struct mismatch
  435. -23 misaligned address
  436. -24 invalid numeric argument
  437. -25 return stack imbalance
  438. -26 loop parameters inaccessible
  439. -27 bogus recursion
  440. -28 user interrupt
  441. -29 attempt to nest definitions
  442. -30 obsolescent feature
  443. -31 >BODY used on non-CREATEd word
  444. -32 invalid name argument
  445. -33 block read exception
  446. -34 block write exception
  447. -35 invalid block number
  448. -36 invalid file position
  449. -37 file i/o exception
  450. -38 non-existent file
  451. -39 unexpected end-of-file
  452. -40 invalid BASE for floating point conversion
  453. -41 loss of precision
  454. -42 floating-point div by zero
  455. -43 floating-point result out of range
  456. -44 floating-point stack over
  457. -45 floating-point stack under
  458. -46 floating-point invalid argument
  459. -47 compilation word list deleted
  460. -48 invalid POSTPONE
  461. -49 search-order overflow
  462. -50 search-order underflow
  463. -51 compilation word list changed during compilation
  464. -52 control-flow stack over
  465. -53 exception stack over
  466. -54 floating-point numeric underflow
  467. -55 floating-point unidentified fault
  468. -56 QUIT
  469. -57 character send/receive exception
  470. -58 [IF] [ELSE] or [THEN] exception
  471.  
  472. FACILITY:
  473.  
  474.     Encoding of keyboard events re: EKEY:
  475.         EKEY not currently implemented.
  476.  
  477.     Duration of system clock tick:
  478.         MS not currently implemented.
  479.     
  480.     Repeatability to be expected from MS:
  481.         MS not currently implemented.
  482.  
  483. FILE:
  484.     <this documentation not finished>
  485.  
  486.     File line terminator:
  487.         <CR><LF> or just <LF>.
  488.  
  489.     Maximum size of an input line:
  490.         256 characters.
  491.  
  492.     Size of string buffer used by S":
  493.         256 characters.
  494.  
  495. General Ambiguous Conditions
  496. ----------------------------
  497.     If the data stack underflows and the interpreter is entered, the condition will be detected and
  498. the appropriate THROW (-4, data stack underflow) will be made. Data stack overflow, return stack underflow and
  499. return stack overflow at present go undetected in Jax4th.
  500.  
  501.     Insufficient space for loop-control parameters at present goes undetected in Jax4th.
  502.  
  503.     Insufficient space in the dictionary at present goes undetected in Jax4th.
  504.  
  505.     If a program addresses a region which is not readable data space, the Windows NT Executive Virtual Memory
  506. Manager will cause an exception which at present will be handled by the Win32 subsystem. Future Jax4th revisions may
  507. handle this exception.
  508.  
  509.     If a program causes a machine division by zero, the Windows NT Kernel will cause an exception which at present
  510. will be handled by the Win32 subsystem. Future Jax4th revisions may handle this exception.
  511.  
  512.     A mathematical result out-of-range will be returned silently. Any mathematical shift with an invalid shift-count
  513. argument returns an undefined result.
  514.  
  515.     An incompatible argument type is rarely recognized by Jax4th, with the exception of passing an execution token
  516. not created by CREATE to >BODY, which will cause the appropriate THROW (-31, >BODY used on non-CREATE word).
  517.  
  518.     An invalid lexical item (neither a name nor a number in the current base) will cause the interpreter/compiler
  519. to perform the appropriate THROW (-13, undefined word).
  520.  
  521.     Interpretation of a word with undefined interpretation semantics results in an appropriate THROW (-14,
  522. interpretive execution of a compile-only construct). If a POSTPONEd construct is executed at interpret time, the
  523. same THROW -14 occurs.
  524.  
  525.     Attempting to find an execution token for a defintion with undefined interpretation semantics succeeds.
  526.  
  527.     An attempt to use a zero-length string as a name due to input stream exhaustion results in the appropriate
  528. THROW (-16, attempt to use zero-length string as a name).
  529.  
  530.     Overflow of pictured numeric output string, though unlikely, occurs silently and may compromise Jax4th
  531. execution.
  532.  
  533.     Parsed string overflow, though unlikely, occurs silently and may compromise Jax4th execution.
  534.  
  535.     A word name exceeding the maximum length of a word name results in an undefined condition. No harm to Jax4th
  536. execution will occur, but the name may not be findable in a recognizable form, or if findable, may have unexpected
  537. attributes, such as unasked-for immediacy.
  538.  
  539.     Program modification of the contents of the input stream or of a string literal are harmless, except,
  540. possibly, to the meaning of the program.
  541.  
  542.     Other ambiguous conditions are documented in the Glossary under the heading for the word to which they pertain.
  543.  
  544. Wordset-specific Ambiguous Conditions
  545. -------------------------------------
  546. BLOCK:
  547.  
  548.     Correct BLOCK read impossible:
  549.         Appropriate THROW is made depending on cause of error.
  550.  
  551.     I/O exception in BLOCK transfer:
  552.         Appropriate THROW is made depending on cause of error.
  553.  
  554.     Invalid BLOCK number:
  555.         Appropriate THROW is made depending on cause of error.
  556.  
  557.     A program directly alters contents of BLK:
  558.         Undefined; better not do it!
  559.  
  560.     No current block buffer for UPDATE:
  561.         Undefined.
  562.  
  563. DOUBLE:
  564.  
  565.     d outside range of n in D>S:
  566.         Silent truncation.
  567.  
  568. EXCEPTION:
  569.  
  570.     None.
  571.  
  572. FACILITY:
  573.  
  574.     AT-XY operation can't be performed on user output device:
  575.         Undefined.
  576.  
  577. FILE:
  578.  
  579.     Attempt to position a file outside its boundaries:
  580.         Should be an appropriate ior or THROW, but
  581.         NT appears to accept such an operation.
  582.  
  583.     Attempting to read from file position not yet written:
  584.         Undefined.
  585.  
  586.     fileid is invalid:
  587.         Appropriate ior or THROW.
  588.  
  589.     I/O exception reading or closing fileid:
  590.         Appropriate ior or THROW.
  591.  
  592.     Named file cannot be opened:
  593.         Appropriate ior or THROW.
  594.  
  595.     Requesting an unmapped BLOCK number.
  596.         Appropriate ior or THROW.
  597.  
  598.     Using SOURCE-ID when BLK is not zero:
  599.         Undefined.
  600.  
  601. Other General System Documentation
  602. ----------------------------------
  603.     System dictionary space:
  604.         Currently, 65,536 address units.
  605.  
  606.     Available application data space:
  607.         Currently, 65,536 address units minus the value returned by HERE at powerup.
  608.  
  609.     Data stack space:
  610.         Currently, 4096 cells.
  611.  
  612.     Return stack space:
  613.         Currently, 4096 cells.
  614.  
  615.     Operator's terminal facilities:
  616.         By default, the Windows NT Console, but there's a whole world of GUI waiting out there!
  617.  
  618. Other Wordset-Specific System Documentation
  619. -------------------------------------------
  620. BLOCK:
  621.  
  622.     Restrictions which multiprogramming places on use of buffer addresses:
  623.         Jax4th does not support multiprogramming.
  624.  
  625.     Number of BLOCKs available for source text and data:
  626.         Limited by file size.
  627.  
  628. DOUBLE:
  629.  
  630.     None.
  631.  
  632. EXCEPTION:
  633.  
  634.     None.
  635.  
  636. FACILITY:
  637.  
  638.     None.
  639.  
  640. FILE:
  641.  
  642.     None.
  643.  
  644.  
  645. Non-Conformance
  646. ---------------
  647.     In the areas discussed below, Jax4th is either non-conforming to the intent of the draft proposed Standard
  648. Forth or of questionable conformity.
  649.  
  650.     Facility:
  651.  
  652.         We ought to make KEY? conform a little more closely to what KEY returns below
  653.     1Bh. Also, KEY? should be discarding non-char-set events it encounters up until the first,
  654.     then should discard no more until KEY is called. We are non-conforming here in that we
  655.     don't discard, but KEY *does* discard the non-char-set key events. However, after calling
  656.     KEY? successfully, EKEY could conceivabley find a non-char-set key event preceding the char
  657.     which triggered the KEY? flag, which doesn't seem to be what the Standard intends 10.6.1.1755.
  658.  
  659.  
  660.     File Word Set:
  661.         ( "paren" is non-compliant in that it does not span multiple lines of source
  662.         seeking its matching right-paren.
  663.  
  664.     String Word Set:
  665.         Of the entire String word set, only SEARCH is not present in the current revision of Jax4th.
  666.  
  667.  
  668. File-Handling, ASCII and Unicode
  669. --------------------------------
  670.     Realize that READ-FILE WRITE-FILE FILE-POSITION REPOSITION-FILE, etc. are supposed in ANS Forth
  671. to deal with "characters". To deal with this, we created parallel defs, e.g., READ-FILEA (ascii) READ-FILEW
  672. (wide-char unicode) and a DEFERred READ-FILE which is vectored by default at powerup (in COLD) to READ-FILEW.
  673.  
  674.     If you want to change the vector for READ-FILEA to read ASCII files, then
  675.  
  676.         ' READ-FILEA ' READ-FILE >BDDY !
  677.  
  678. is sufficient.
  679.  
  680.     Affected words, all of which are now deferred words, vectored by default at powerup to their Unicode
  681. versions (e.g., FILE-POSITION executes FILE-POSITIONW instead of FILE-POSITIONA):
  682.  
  683.         FILE-POSITION
  684.         FILE-SIZE
  685.         READ-FILE
  686.         REPOSITION-FILE
  687.         RESIZE-FILE
  688.         WRITE-FILE
  689.  
  690.     The word READ-LINE is currently Unicode only.
  691.  
  692.     NOTE!!! that BLOCK always reads characters, not bytes. The ANSI definition of a BLOCK is 1024
  693. characters, so BLOCK calls READ-FILEW WRITE-FILEW etc. directly. BLOCK is *not* affected by any revectoring
  694. you do.
  695.  
  696.     See below: "BLOCK File Loading in Jax4th" and "Unicode Text File Loading in Jax4th".
  697.  
  698.     NOTE!!! The S" in Jax4th appends a null character 0x0000 to the end of the string
  699. which it parses. If you need a null-terminated string for a system call, just DROP the count
  700. from such a string.
  701.  
  702. Selected Low-Level Details about Jax4th
  703. ---------------------------------------
  704.     The method of compilation of kernel addresses may not work forever. Currently in NT, on loading code it loads at
  705. the same address each time, but that may not last. In any event, the user will have to recompile saved dictionaries
  706. each new release of Jax4th and probably each new release of NT. Alternatively, we could do runtime relocation of
  707. dictionary. Of course, if we went that far, why not go for a subroutine-threaded design?
  708.  
  709.     The Console handles are exposed in Jax4th so you can go wild and play with the Console capabilities
  710. of NT from within Jax4th if you are up to programming it. The VARIABLEs StdIn StdOut and StdErr contain the
  711. handles you need. Also see ConsoleMode GetConsoleMode and SetConsoleMode (in the source code if I haven't
  712. managed to get info into the Glossary by the time you read this.
  713.  
  714.     Structs are weird between MASM and Windows NT. For instance, the INPUT_RECORD structure defines
  715. the InputRecord.EventType as WORD but you have to say DWORD in MASM in this instance (WINDOWS.I) and then
  716. in referencing the data use WORD to avoid getting garbage (see the source KEY? in JAX4TH.A). The alignment
  717. factor as treated by MASM isn't always automatically the same as the alignment factor in the C includes.
  718.  
  719. Stylistic
  720. ---------
  721.     As simple and good-old as this Forth can be made. Indirect threaded. Going beyond the CORE, it's not exactly the
  722. minimal implementation, but pretty much just that I felt made a compact yet complete system. Forth programmers don't need
  723. floating point or local variables, but they *do* like DUMP.
  724.  
  725. Loading Source Code in Jax4th
  726. -----------------------------
  727.     The draft proposed Standard for Forth mandates that if any file-loading capabilities are present in a Standard
  728. System, the classic Forth mass storage mechanism BLOCK must be present. Loading prepared program source into Jax4th is
  729. done via this BLOCK mechanism or via loading from a text file. Both BLOCK files and text files for Jax4th must be
  730. Unicode, not ASCII. See below about converting and loading BLOCK and text files.
  731.  
  732. Converting ASCII BLOCK and Text Files to Unicode BLOCK and Text Files
  733. ---------------------------------------------------------------------
  734.     While classic Forth BLOCKs consist of 1024 bytes, ANS Forth says that a BLOCK consists of 1024 characters. A
  735. character in Jax4th is 16 bits wide (Unicode), so a BLOCK file edited under a typical Forth BLOCK editor won't load in
  736. Jax4th without massaging. Since Jax4th doesn't have a very good BLOCK editor yet, this could be a drawback. However, we
  737. have provided file massaging utilities coded in C to allow you to use a BLOCK editor from another Forth system to do
  738. development.
  739.  
  740.     UNIBLOCK.EXE [sourcefile destfile ]|[/?] converts an ASCII file sourcefile to a Unicode file destfile. Type
  741. UNIBLOCK /? for help.
  742.  
  743.     UNIASCII.EXE [sourcefile destfile ]|[/?] converts a Unicode file sourcefile to an ASCII file destfile. Type
  744. UNIASCII /? for help.
  745.  
  746.     Both these utilities work on text files as well as BLOCK files.
  747.  
  748.     Note: The BLOCK (*.BLK) and text files (*.UTF) distributed with Jax4th are already converted! The only
  749. non-Unicode source file included is EXAMPLES\SHORTEST.F which is used to demonstrate DDE pasting of ASCII source
  750. into Unicode Jax4th. Don't convert SHORTEST.F!
  751.  
  752. BLOCK File Loading in Jax4th
  753. ----------------------------
  754.     To open a BLOCK file, use OPEN-FILE:
  755.  
  756.         S" EXAMPLE\JX4EXAMP.BLK" R/W OPEN-FILE
  757.  
  758.     If the return from OPEN-FILE is zero (0), the operation was successful and the file handle is on the data
  759. stack. Store that file handle in the system variable BLOCK-FILE:
  760.  
  761.         BLOCK-FILE !
  762.  
  763.     After that you may use LIST and LOAD and they will perform as they always have in Forth.
  764.  
  765. Unicode Text File Loading in Jax4th
  766. ------------------------------------
  767.     Jax4th interprets text files. However, they have to be UNICODE text files.
  768. UNIPAD in the Windows NT %MSTOOLS%\BIN     directory is brain-dead and buggy. One way to deal
  769. with Unicode is to use UNIBLOCK.EXE to convert the text files you are editing to Unicode files.
  770. (It's *called* UNIBLOCK but it doesn't really care if it's a BLOCK file or a plain text file.
  771. I am using the .UTF extension for Unicode text files since that's what Unipad wants to do.
  772.  
  773.     To interpret a text file, pass a valid file id to INCLUDE-FILE.
  774.  
  775.         S" UTILS\UB2T.UTF" R/O OPEN-FILE .
  776.         0 ok1
  777.         VARIABLE MyFile !
  778.         ok0
  779.         MyFile @ INCLUDE-FILE
  780.         ok    \ Text will have been interpreted before this prompt appears.
  781.  
  782.     Alternatively, used INCLUDED, e.g.,
  783.  
  784.         S" UTILS\UB2T.UTF" INCLUDED
  785.         ok    \ Text will have been interpreted before this prompt appears.
  786.  
  787.     Of course, you could just define INCLUDE as follows:
  788.  
  789.         : INCLUDE BL WORD COUNT INCLUDED ;
  790.         ok INCLUDE UTILS\UB2T.UT
  791.         ok    \ Text will have been interpreted before this prompt appears.
  792.  
  793. which is probably the best way to go.
  794.  
  795.     NOTE: Jax4th doesn't handle embedded tabs or other control chars (except CR & LF)
  796. yet. Make sure your text editor is doing "soft tabs". i.e., inserting four or more spaces
  797. for tabs instead of hex 09 characters.
  798.  
  799.     NOTE: Paren "(" is non-compliant with the Standard in that it doesn't span multiple
  800. lines of text file interpretation while awaiting its matching right-paren ")". (I voted
  801. against that stupid idea on X3J14, by the way). Will fix this Real Soon Now.
  802.  
  803. Making Windows NT System Calls from Jax4th
  804. -------------------------------------------
  805.     There are several words of interest to one desiring to write Windows NT system calls in Jax4th. Their
  806. explanations should be examined in the Glossary of this document:
  807.  
  808.     ASCIIZ
  809.     DATATOABS
  810.     GetProcAddress
  811.     FreeLibrary
  812.     LoadLibraryEx
  813.     SYSCALL
  814.  
  815.     The procedure is as follows:
  816.  
  817.     1) Load the library using LoadLibraryEx and save the handle in a variable. Make sure you got a valid handle
  818. back, and not a NULL.
  819.     2) Use GetProcAddress to get the addresses of any calls you wish to make.
  820.     3) Push parameters on stack right-to-left from their formal parameters as documented in the Windows NT SDK,
  821. taking care to convert Forth data-relative addresses to absolute addresses via DATATOABS.
  822.     4) Push address obtained from GetProcAddress on stack and execute SYSCALL. The returns in EDX and EAX will be
  823. found on the stack afterwards.
  824.     5) Use FreeLibrary to free the library reference made by the earlier LoadLibraryEx.
  825.  
  826.     Note the funny aspect of NT that LoadLibraryEx takes Unicode strings for library names, but GetProcAddress
  827. only accepts ASCIIZ strings. Therefore, we have provided ASCIIZ to return the address of a null-terminated byte string
  828. for this sort of system call.
  829.  
  830.     Here is an example of using the system call Beep(dwFreq,dwDuration)
  831.  
  832.     VARIABLE KERNEL32 
  833.     0 0 S" KERNEL32.DLL" DROP DATATOABS LoadLibraryEx
  834.     KERNEL32 !
  835.     VARIABLE SYSBEEP
  836.     S" Beep" ASCIIZ DATATOABS KERNEL32 @ GetProcAddress
  837.     SYSBEEP !
  838.     1000 ( duration) 440 ( frequency) SYSBEEP @ SYSCALL ( Beeps A:440 for 1 second.)
  839.  
  840.     The above example will leave two (2) items on the stack: the contents of the registers EDX and EAX. Windows NT
  841. DLLs return singles in EAX and doubles in EDX:EAX. I probably should change the order in which these are returned on
  842. the stack ... currently EAX, which is more often useful, is on top.
  843.  
  844.     Note that you do not have to re-open the library and re-resolve the procedure address every time you make the
  845. call, but you must do so each time you load your Forth image, since these addresses and handles are not fixed.
  846.  
  847.     Before you exit, you should close the libraries you opened.
  848.  
  849.     KERNEL32 @ FreeLibrary
  850.  
  851.     ... will do the trick in the above example.
  852.  
  853.     NOTE: An example of writing a nice front end to Windows NT System Calls is found in UTILS\SYSCALLS.UTF.
  854.  
  855. Example Source Code
  856. -------------------
  857.     There are two directories of Forth source code, \EXAMPLE and \UTILS.
  858.  
  859.     \EXAMPLE contains a Unicode BLOCK file called PASTE.BLK prepared by Clifford L. King
  860. of Micro K Systems, Aurora, Colorado, along with an ASCII test file SHORTEST.F. PASTE.BLK
  861. demonstrates DDE in Jax4th.
  862.  
  863.     \UTILS contains Unicode text files:
  864.  
  865.     UTILS\UTILS.UTF        Unicode text source for various utilities.
  866.     UTILS\EDITOR.UTF    Unicode text source for a simple Unicode BLOCK
  867.                 file editor.
  868.     UTILS\MEMORY.UTF    Unicode text source for the Memory Allocation
  869.                 word set.
  870.     UTILS\SYSCALLS.UTF    Unicode text source examples of Jax4th system
  871.                 calls to NT DLLs.
  872.     UTILS\UB2T.UTF        Unicode text source for program to convert
  873.                 Unicode BLOCK files to Unicode text files.
  874.     UTILS\YIQING.UTF    Cast the Yi Qing oracle.
  875.  
  876.     NOTE!!! that the files are somewhat mutually dependent, but have a rudimentary conditional
  877. include facility (awaiting my implementation of [IF] [ELSE] and [THEN]). They expect that Jax4th
  878. has been launched in the top-level Jax4th directory and that .\UTILS\*UTF is present.
  879.  
  880.     The Unicode BLOCK file JX4EXAMP.BLK has been removed and its previous contents broken into
  881. the above-mentioned .UTF files, with some additions.
  882.  
  883. To Do
  884. -----
  885.     KEY KEY? EKEY EKEY? are working but I think I have to make KEY? conform a little more
  886.     closely to what KEY returns. Also, KEY? should be discarding non-char-set events it
  887.     encounters up until the first, then should discard no more until KEY is called. We
  888.     are non-conforming here.
  889.  
  890.     Finish cleaning up struct declarations in WINDOWS.I.
  891.  
  892.     Change WORDLISTS so they return tokens instead of addresses so that user can save
  893.     images which have non-system wordlists in the search order at SAVE-FORTH time.
  894.  
  895. Glossary of Jax4th
  896. ------------------
  897. !!!***!!! This Glossary is not finished, but it does contain all the words in Jax4th.
  898.  
  899.     Here is a sorted list of all words in Jax4th, with their stack arguments, the wordlist in which they are found,
  900. and a brief definition.  The dpANS-Forth word set (if any) from which the word is taken is indicated. The definitions
  901. contained herein are NOT OFFICIAL DEFINITIONS. For more information, see the Standard itself [ANSI/IEEE X3.215-199x].
  902.  
  903.     THIS GLOSSARY IS NOT A FORTH TUTORIAL! The entry for >R notes that the top data stack item moves to the
  904. return stack, but doesn't tell you what every Forther knows, that that same item had better be moved off before
  905. the next semi-colon is hit.
  906.  
  907.  
  908.     Key to stack abbreviations:
  909.     ---------------------------
  910.     x        any single-cell stack item
  911.     xd        any double-cell stack item
  912.     n        any signed single-cell integer
  913.     +,-n        any positive,negative single-cell integer
  914.     d        any signed double-cell integer
  915.     +,-d        any positive,negative double-cell integer
  916.     u        any unsigned single-cell integer
  917.     ud        any unsigned double-cell integer
  918.     c        a character
  919.     "ccc"        a string of characters in the input stream
  920.     "ccc<a>"    a string of characters in the input stream terminated by a character <a>
  921.     name        a Forth word's name in the input stream
  922.     addr        an address in Forth data space
  923.     a-addr        a cell-aligned address in Forth data space
  924.     c-addr        a character-aligned address in Forth data space
  925.     xt        an execution token
  926.     R:        happening on the return stack
  927.     C:        happening on the control flow stack
  928.     
  929.  
  930. Notes:
  931.  
  932.     - An "aligned address" is one that falls on a boundary fitting the host architecture.
  933.     In the case of Jax4th for Windows NT, that's on a word (16-bit) boundary, an even address.
  934.  
  935.     - The gloss "iff" is to be read as in logic, "if-and-only-if".
  936.  
  937. The Words
  938. ---------
  939. !        ; x a-addr --            FORTH-WORDLIST        CORE
  940.     Store cell x at a-addr.
  941.  
  942. #        ; ud1 -- ud2            FORTH-WORDLIST        CORE
  943.     ud2 is ud1's double integer quotient by BASE @. The modulus of character width is deposited
  944. at the current index into the pictured numeric output string buffer.
  945.  
  946. #>        ; ud -- c-addr u        FORTH-WORDLIST        CORE
  947.     ud is discarded and the address and count of the pictured numeric output string stored in the
  948. transient pictured numeric output string buffer is returned.
  949.  
  950. #S        ; ud1 -- ud2            FORTH-WORDLIST        CORE
  951.     perform successive # operations on ud1 until ud2 is zero (0).
  952.  
  953. #TIB        ; -- c-addr            FORTH-WORDLIST        CORE EXT
  954.     variable holding number of chars ACCEPTed into TIB the last time TIB got filled.
  955.  
  956. '        ; -- xt | abort            FORTH-WORDLIST        CORE
  957.     consume a word from the input stream and find it in one of the wordlists in the search order.
  958. Return the word's execution token, or THROW a -13 if the word is not found.
  959.  
  960. 'TIB        ; -- a-addr            NONSTANDARD-WORDLIST    ---
  961.     address of the TIB. Standard programs don't modify the data at that address.
  962.  
  963. (ACCEPT)    ; c-addr +n1 -- +n2        INTERNALS-WORDLIST    ---
  964.     interal to ACCEPT.
  965.  
  966. (PARSE)     ; char "ccc<char>" -- c-addr u    INTERNALS-WORDLIST    ---
  967.     interal to PARSE.
  968.  
  969. (        ; "ccc<)>" --            FORTH-WORDLIST        CORE
  970.     Parse up to the next ) and discard. If no ) is found to the end of the input stream,
  971. discard entire remainder of input stream.
  972.  
  973. *        ; n|u1 n|u2 -- n|u3        FORTH-WORDLIST        CORE
  974.     Multiply n|u1 by n|u2 returning n|u3.
  975.  
  976. */        ; n1 n2 n3 -- n4        FORTH-WORDLIST        CORE
  977.     Multiply n1 by n2 and divide the intermediate double product by n3 yielding quotient n4.
  978. Follows default signed division algorithm.
  979.  
  980. */MOD        ; n1 n2 n3 -- n4 n5        FORTH-WORDLIST        CORE
  981.     As */ but returning remainder n4 and quotient n5. Follows default signed division algorithm.
  982.  
  983. +        ; n|u1 n|u2 -- n|u3        FORTH-WORDLIST        CORE
  984.     Addition.
  985. +!        ; x a-addr --            FORTH-WORDLIST        CORE
  986.     Increment the datum stored a x-addr by the value of x. In the case of overflow/underflow
  987. of the incremented value, Jax4th silently two's-complement wraps.
  988.  
  989. +LOOP        ; u --                FORTH-WORDLIST        CORE
  990.     Loop back to the syntactically enclosing DO, having added x to the loop index.
  991.  
  992. ,        ; x --                FORTH-WORDLIST        CORE
  993.     Store the cell value x to the next available cell in data space and advance the allotment
  994. pointer whose value is returned by HERE by value of one cell.
  995.  
  996. -        ; n|u1 n|u2 -- n|u3        FORTH-WORDLIST        CORE
  997.     Subtraction.
  998.  
  999. -ROT        ; x1 x2 x3 -- x3 x1 x2        NONSTANDARD-WORDLIST    ---
  1000.     Rotate the top data element to third-on-stack.
  1001.  
  1002. -TRAILING    ; c-addr1 u1 -- c-addr1 u2    FORTH-WORDLIST        CORE
  1003.     Shorten the string count u1 by subtracting the count of trailing blanks to yield u2.
  1004.  
  1005. .        ; n --                FORTH-WORDLIST        CORE
  1006.     Print to the current output device the signed single n in the current number base.
  1007.  
  1008. ."        ; Interp -- c-addr u Compile --    FORTH-WORDLIST        CORE
  1009.     When encountered, compile the following characters in the input stream until the
  1010. end of the input stream or until a " is encountered into the dictionary with the runtime
  1011. routine to print the string thus compiled to the current output device.
  1012.  
  1013. ..        ; i*x --            NONSTANDARD-WORDLIST    ---
  1014.     Print the entire data stack destructively.
  1015.  
  1016. .NAME        ; c-addr --            NONSTANDARD-WORDLIST    ---
  1017.     Print out a name header. ' DUP TOKENTODATA EXETONAME .NAME will print DUP.
  1018.  
  1019. .S        ; i*x -- i*x            FORTH-WORDLIST        TOOLS
  1020.     Print the entire data stack non-destructively.
  1021.  
  1022. .WID        ; wid --            NONSTANDARD-WORDLIST    ---
  1023.     Print the name and wid of the wordlist represented by WID.
  1024.  
  1025. .WORD        ; link-token --            INTERNALS-WORDLIST    ---
  1026.     Print out the name of a word whose link token is on the stack.
  1027.  
  1028. /        ; n1 n2 -- n3            FORTH-WORDLIST        CORE
  1029.     Divide signed single n1 by signed single n2 returning the quotient n3,
  1030. according to default signed division algorithm.
  1031.  
  1032. /MOD        ; n1 n2 -- n3 n4        FORTH-WORDLIST        CORE
  1033.     As / but returning remainder n3 and quotient n4.
  1034.  
  1035. /STRING     ; c-addr1 u1 n -- c-addr2 u2    FORTH-WORDLIST        CORE
  1036.     Index into a string by n characters.
  1037.  
  1038. 0<        ; x -- flag            FORTH-WORDLIST        STRING
  1039.     TRUE iff x viewed as a signed single is less than zero.
  1040.  
  1041. 0<>        ; x -- flag            FORTH-WORDLIST        CORE
  1042.     TRUE iff x is non-zero.
  1043.  
  1044. 0=        ; x -- flag            FORTH-WORDLIST        CORE EXT
  1045.     TRUE iff x is zero.
  1046.  
  1047. 0>        ; x -- flag            FORTH-WORDLIST        CORE
  1048.     TRUE iff x viewed as a signed single is greater than zero.
  1049.  
  1050. 1+        ; n|u1 -- n|u2            FORTH-WORDLIST        CORE
  1051.     Add one (1) to two's-complement wrapping n|u1.
  1052.  
  1053. 1-        ; n|u1 -- n|u2            FORTH-WORDLIST        CORE
  1054.     Subtract one (1) from two's-complement wrapping n|u1.
  1055.  
  1056. 2!        ; x1 x2 a-addr --        FORTH-WORDLIST        CORE
  1057.     Store a double-cell number at the two cells starting at a-addr. Store
  1058. in the order x2 x1.
  1059.  
  1060. 2*        ; x1 -- x2            FORTH-WORDLIST        CORE
  1061.     Left-shift x1 one bit, shifting zeroes into the lowest bit.
  1062.  
  1063. 2/        ; x1 -- x2            FORTH-WORDLIST        CORE
  1064.     Right-shift x1 one bit, shifting zeroes into the highest bit.
  1065.  
  1066. 2>R        ; x1 x2 --     R: -- x1 x2    FORTH-WORDLIST        CORE EXT
  1067.     Move two items from data stack to return stack in specific order.
  1068. See 2R>
  1069.  
  1070. 2@        ; a-addr -- x1 x2        FORTH-WORDLIST        DOUBLE
  1071.     Fetch the double-cell item stored at a-addr to the data stack.
  1072.  
  1073. 2DROP        ; x1 x2 --            FORTH-WORDLIST        CORE
  1074.     Drop top two stack items.
  1075.  
  1076. 2DUP        ; x1 x2 -- x1 x2 x1 x2        FORTH-WORDLIST        CORE
  1077.     Duplicate top double-cell stack entry.
  1078.  
  1079. 2LITERAL    ; x x --            FORTH-WORDLIST        CORE
  1080.     Consume at compile time the top two stack entries and compile
  1081. as a double-cell literal to be deposited on the runtime stack at execution
  1082. of the construct into which the 2LITERAL is compiled.
  1083.  
  1084. 2OVER        ; x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2    FORTH-WORDLIST    CORE
  1085.     Copy the second double-cell data stack entry over the top double-cell
  1086. data stack entry.
  1087.  
  1088. 2R>        ; -- x1 x2    R: x1 x2 --        FORTH-WORDLIST    CORE EXT
  1089.     Undo the effect of 2>R (q.v.) returning two items from the return stack
  1090. to the data stack in specific order.
  1091.  
  1092. 2SWAP        ; x1 x2 x3 x4 -- x3 x4 x1 x2        FORTH-WORDLIST    CORE
  1093.     Swap the top two double-cell data stack entries.
  1094.  
  1095. :        ; --                FORTH-WORDLIST        CORE
  1096.     Parse a name from the input stream and start a new definition. Saves
  1097. an internal record of the depth of the data stack at start of compilation.
  1098.  
  1099. :NONAME        ; --xt                FORTH-WORDLIST        CORE
  1100.     Start a headerless definition whose execution token will be deposited
  1101. on the data stack after the next occurence of ; (semi-colon). Saves an internal
  1102. record of the depth of the data stack at start of compilation.
  1103.  
  1104. ;        ; --                FORTH-WORDLIST        CORE EXT
  1105.     Terminate a definition commenced by ; (colon) or :NONAME. See if depth
  1106. of stack has changed since initiation of compilation. THROW a -52 if depth has
  1107. changed.
  1108.  
  1109. <        ; n1 n2 -- flag            FORTH-WORDLIST        CORE
  1110.     TRUE iff signed single n1 is less than signed single n2.
  1111.  
  1112. <#        ; --                FORTH-WORDLIST        CORE
  1113.     Commence formatting a numeric output string.
  1114.  
  1115. <>        ; x1 x2 -- flag            FORTH-WORDLIST        CORE EXT
  1116.     TRUE iff x1 is not the same bit pattern as x2.
  1117.  
  1118. =        ; x1 x2 -- flag            FORTH-WORDLIST        CORE
  1119.     TRUE iff x1 is the same bit pattern as x2.
  1120.  
  1121. >        ; n1 n2 -- flag            FORTH-WORDLIST        CORE
  1122.     TRUE iff signed single n1 is greater than signed single n2.
  1123.  
  1124. >BODY        ; xt -- a-addr            FORTH-WORDLIST        CORE
  1125.     Convert the execution token of a CREATEd object into its data address.
  1126. If xt doesn't represent a child of CREATE then THROW a -31.
  1127.  
  1128. >IN        ; -- a-addr            FORTH-WORDLIST        CORE
  1129. >NUMBER     ; ud1 c-addr1 u1 -- ud2 c-addr2 u2    FORTH-WORDLIST    CORE
  1130.     Converts the string at c-addr1 u1 to a double-cell number in the current
  1131. number base. All characters in the string must be digits. Returns the address and
  1132. count of unconverted characters remaining in string.
  1133.  
  1134. >R        ; x --    R: -- x            FORTH-WORDLIST        CORE
  1135.     Move the top data stack item to the top of the return stack. Compile-only.
  1136.  
  1137. ?DO        ; u1 u2 --            FORTH-WORDLIST        CORE EXT
  1138.     Consume an outer (u1) and inner (u2) loop limit. If they are not identical,
  1139. commence the body of the loop.
  1140.  
  1141. ?DUP        ; x -- x x | 0            FORTH-WORDLIST        CORE EXT
  1142.     Duplicate the top data stack item iff non-zero.
  1143.  
  1144. ?STACK        ; i*j -- i*j | -        NONSTANDARD-WORDLIST    --
  1145.     ABORT if stack has underflowed or overflowed.
  1146.  
  1147. @        ; a-addr -- x            FORTH-WORDLIST        CORE
  1148.     Fetch x from the cell at a-addr.
  1149.  
  1150. [        ; --                FORTH-WORDLIST        CORE
  1151.     Enter interpretive state. Compile-time only.
  1152.  
  1153. [']        ; -- | abort            FORTH-WORDLIST        CORE
  1154.     At compile time, append the execution token for the following name
  1155. in the input stream as a literal to the current definition.
  1156.  
  1157. [CHAR]        ; --    Execution: -- char    FORTH-WORDLIST        CORE
  1158.     At compile time, append a numeric literal to the current definition representing
  1159. the first character of the next non-blank string in the input stream.
  1160.  
  1161. ]        ; --                FORTH-WORDLIST        CORE
  1162.     Enter compile state.
  1163.  
  1164. ABORT        ; --                FORTH-WORDLIST        EXCEPTION EXT
  1165.     Compile a -1 THROW. Compilation only.
  1166.  
  1167. ABORT"        ; ccc<"> --            FORTH-WORDLIST        EXCEPTION EXT
  1168.     Consume a string terminated by double-quote and compile the string as an error
  1169. message and a -2 THROW which will have the effect of printing the message
  1170.  
  1171. ABOUT        ; --                NONSTANDARD-WORDLIST    ---
  1172.     Prints a revision message followed by a message about Jax4th's Lack of Warranty as free software.
  1173.  
  1174. ABS        ; n -- u            FORTH-WORDLIST        CORE
  1175.     Return absolute value u of n.
  1176.  
  1177. ABSTOCODE    ; abs-addr -- code-addr        SYSTEM-WORDLIST        ---
  1178.     Convert a Windows NT address to a Jax4th user-code-space-relative address.
  1179.  
  1180. ABSTODATA    ; abs-addr -- data-addr        SYSTEM-WORDLIST        ---
  1181.     Convert a Windows NT address to a Jax4th data-space-relative address.
  1182.  
  1183. ACCEPT        ; c-addr +n1 -- +n2        FORTH-WORDLIST        CORE
  1184.     Accept up to +n1 characters at c-addr from the user, returning +n2, the
  1185. count of characters actually received before a possible terminating EOL.
  1186.  
  1187. AGAIN        ; --                FORTH-WORDLIST        CORE
  1188.     At compile time, consume a "dest" branch destination from the control flow stack.
  1189. At runtime, cause a loop back to the corresponding BEGIN.
  1190.     
  1191. ALIGN        ; --                FORTH-WORDLIST        CORE
  1192.     Align data space to a boundary corresponding to the alignment needs of the host
  1193. architecture.
  1194.  
  1195. ALIGNED     ; addr -- a-addr        FORTH-WORDLIST        CORE
  1196.     If the address addr on the data stack is not aligned, increment it to the next
  1197. aligned address.
  1198.  
  1199. ALLOT        ; n --                FORTH-WORDLIST        CORE
  1200.     Allot n address units in the data space.
  1201.  
  1202. ALSO        ; --                FORTH-WORDLIST        SEARCH EXT
  1203.     Dup the top of the wordlist stack.
  1204.  
  1205. AND        ; x1 x2 -- x3            FORTH-WORDLIST        CORE
  1206.     x3 is the bitwise AND of x1 and x1.
  1207.  
  1208. ASCIIZ        ; c-addr u -- addr        SYSTEM-WORDLIST        ---
  1209.     Copies a character string specified by c-addr u as a null-terminated ASCII string into a system buffer whose
  1210. address is then returned. This system buffer is overwritten each time ASCIIZ is called. Used for NT system calls which
  1211. don't accept unicode. The buffer is 256 ASCII characters long, and the null terminator will use up one of these character
  1212. addresses, so the maxiumum value for the argument  u  is thus 255.
  1213.  
  1214.     NOTE: The address returned by ASCIIZ is a data address, and must be converted via DATATOABS before being
  1215. passed to a system call.
  1216.  
  1217. AT-XY        ; u1 u2 --            FORTH-WORDLIST        FACILITY
  1218.     Move the cursor to the xy position represented by u1 (x) u2 (y).
  1219.  
  1220. B!        ; byte addr --            NONSTANDARD-WORDLIST    ---
  1221.     Store a byte to addr.
  1222.  
  1223. B@        ; addr -- byte            NONSTANDARD-WORDLIST    ---
  1224.     Fetch a byte from addr.
  1225.  
  1226. BASE        ; a-addr            FORTH-WORDLIST        CORE
  1227.     Return the address where is stored the numeric conversion base.
  1228.  
  1229. BEGIN        ; -- dest            FORTH-WORDLIST        CORE
  1230.  
  1231. BIN        ; fam1 -- fam2            FORTH-WORDLIST        FILE
  1232.     Set the file mode for binary access. A no-op in Jax4th for Windows
  1233. NT, just included for source compatibility.
  1234.  
  1235. BL        ; -- char            FORTH-WORDLIST        CORE
  1236.     Leaves the character for a blank space on the stack.
  1237.  
  1238. BLK        ; -- a-addr            FORTH-WORDLIST        BLOCK
  1239.     Indicates the current compilation block, or the user input device if 0.
  1240.  
  1241. BLOCK        ; u -- a-addr            FORTH-WORDLIST        BLOCK
  1242.     Returns the address of the BLOCK buffer containing block u, if available.
  1243. Will THROW if, for any of a variety of reasons, the requested BLOCK not available.
  1244. The file being used for BLOCKs is the file whose file-id from OPEN-FILE is placed
  1245. in the Jax4th variable BLOCK-FILE, q.v.
  1246.  
  1247. BLOCK-FILE    ; -- a-addr            NONSTANDARD-WORDLIST    ---
  1248.     Variable used to determine the file used for BLOCK I/O. Contains a file-id
  1249. obtained from OPEN-FILE and placed in BLOCK-FILE by the user. Many files may be kept
  1250. open and their file-id's stored elsewhere to be swapped in and out of BLOCK-FILE in
  1251. the course of your operations, should you so desire. However, remember to EMPTY-BUFFERS
  1252. if you change the file-id in BLOCK-FILE and want to read in a same-numbered BLOCK, or
  1253. you will get the old BLOCK from the previous file (which will still be valid from the
  1254. point of view of the BLOCK subsystem, which doesn't watch you swapping file-id's in
  1255. BLOCK-FILE).
  1256.  
  1257.     For example, here's how to load the example code (if you started Jax4th in
  1258. the EXAMPLE directory):
  1259.  
  1260.     S" JX4EXAMP.BLK" R/O OPEN-FILE .
  1261.     0  ok1
  1262.     BLOCK-FILE !
  1263.      ok0
  1264.     1 LOAD
  1265.  
  1266. BUFFER        ; u -- a-addr            FORTH-WORDLIST        BLOCK
  1267.     Returns the address of the buffer currently assigned to block u, or assigns
  1268. one to block u if block u is not currently resident. If an UPDATEd buffer is thus
  1269. reassigned to make room for block u, the UPDATEd block will be written out to mass
  1270. storage. Block u is not read in by BUFFER; a BLOCK operation is required for that
  1271. to occur.
  1272.  
  1273. BYE        ; --                FORTH-WORDLIST        TOOLS EXT
  1274.     Exit the system, saying goodbye. Does not explicitly close any objects
  1275. except those opened by Jax4th itself. Clean up after yourself!
  1276.  
  1277. C!        ; c c-addr --            FORTH-WORDLIST        CORE
  1278.     Store a character c to a character-aligned address c-addr.
  1279.  
  1280. C,        ; char --            FORTH-WORDLIST        CORE
  1281.     Allot one char's worth of data space and store char there.
  1282.  
  1283. C@        ; c-addr -- char        FORTH-WORDLIST        CORE
  1284.     char is the char which is located at c-addr.
  1285.  
  1286. CATCH        ; i*x xt -- j*x 0 | i*x n)    FORTH-WORDLIST        EXCEPTION
  1287.     CATCH a THROW, e.g., : TEST ['] FOO CATCH ;
  1288.  
  1289.     If the return is j*x 0 no THROW was encountered in the execution of
  1290. FOO otherwise n is the THROW code and the stack is the depth it was before
  1291. CATCH commenced execution, though not necessarily containing the same
  1292. items.
  1293.  
  1294. CATCHFIRSTCATCH ; --                INTERNALS-WORDLIST    ---
  1295.  
  1296. CELL+        ; a-addr1 -- a-addr2        FORTH-WORDLIST        CORE
  1297.     Add the number of address units between two adjacent aligned addresses
  1298. to a-addr1 producing a-addr2.
  1299.  
  1300. CELLS        ; n1 -- n2            FORTH-WORDLIST        CORE
  1301.     n2 is n1 times the number of address units in a cell.
  1302.  
  1303. CHAR        ; -- char            FORTH-WORDLIST        CORE
  1304.     Parses for a char, returning the char value upon the data stack. Discards
  1305. all text in input stream after char before the next delimiter.
  1306.  
  1307. CHAR+        ; c-addr1 -- c-addr2        FORTH-WORDLIST        CORE
  1308.     Add the number of address units between two adjacent character-aligned addresses
  1309. to c-addr1 producing c-addr2.
  1310.  
  1311. CHARS        ; n1 -- n2            FORTH-WORDLIST        CORE
  1312.     n2 is n1 times the number of address units in a char.
  1313.  
  1314. CHECKDEPTH    ; j*x -- j*x [ 0 | n if stack has changed ]    INTERNALS-WORDLIST    ---
  1315.  
  1316. CLOSE-FILE    ; fileid -- ior ( == system error if failure, == 0 if success)    FORTH-WORDLIST        FILE
  1317.     Close the file represented by fileid, returning system-dependent io result ior (0 on success).
  1318.  
  1319. CMOVE        ; c-addr1 c-addr2 u --        FORTH-WORDLIST        CORE
  1320.     Move u characters from c-addr1 to c-addr2 starting at low addresses
  1321. and moving higher.
  1322.  
  1323.     See CMOVE> MOVE
  1324.  
  1325. CMOVE>        ; c-addr1 c-addr2 u --        FORTH-WORDLIST        CORE
  1326.     Move u characters from c-addr1 to c-addr2 starting at high addresses
  1327. and progressing lower. The concept of "C-Move-Right" is that it is responsible
  1328. for moving data higher in memory when the regions overlap. It handles this by
  1329. copying data regions end-to-front to avoid replication in a "rightwards" (i.e.,
  1330. higher in memory) overlapping move.
  1331.  
  1332.     See CMOVE MOVE
  1333.  
  1334. CODETOABS    ; code-addr -- abs-addr        SYSTEM-WORDLIST        ---
  1335.     Convert a user-code-relative address to an absolute address. Such calculations
  1336. should generally be made at runtime, not at compile time.
  1337.  
  1338. CODETODATA    ; code-addr -- data-addr    SYSTEM-WORDLIST        ---
  1339.     Convert a user-code-relative address to a user data address. Such calculations
  1340. should generally be made at runtime, not at compile time.
  1341.  
  1342.  
  1343. COLD        ; --                NONSTANDARD-WORDLIST    ---
  1344.     Executed when Jax4th starts up to initialize the system, thn executes the FORTH command
  1345. line (if any) that accompanied the invocation of Jax4th, then returns the system to QUIT. You
  1346. may execute this any time, but be aware your original invocation command line will be re-executed.
  1347.  
  1348. COMPARE     ; c-addr1 u1 c-addr2 u2 -- n    FORTH-WORDLIST        STRING
  1349.     If the strings at c-addr1 u1 and c-addr2 u2 are char-for-char the same,
  1350. including length, return 0. If u1 and u2 are different, compare up to the length
  1351. of the shorter string. If the two strings are identical up to the length of the
  1352. shorter string, return -1 if u1 < u2 and 1 otherwise. If the two strings are not
  1353. identical up to the length of the shorter, return -1 if the char value of the
  1354. first nonmatching char c-addr1[n] < c-addr2[n] and return 1 otherwise.
  1355.  
  1356. COMPILE,    ; xt --                FORTH-WORDLIST        CORE EXT
  1357.     Append the execution token xt to the current definition.
  1358.  
  1359. ConsoleMode    ; -- a-addr            SYSTEM-WORDLIST        --
  1360.     Contains the last Console Mode setting by the system. Applications which
  1361. change the Console Mode should update this variable.
  1362.  
  1363. CONSTANT    ; x "name" --            FORTH-WORDLIST        CORE
  1364.     Create a word named "name" which at runtime returns x on the data stack.
  1365.  
  1366. COUNT        ; c-addr1 -- c-addr2 u        FORTH-WORDLIST        CORE
  1367.     Convert the counted string a c-addr1 to the address c-addr2 and count
  1368. u.
  1369.  
  1370. CR        ; --                FORTH-WORDLIST        CORE
  1371.     Emit a newline to the current output device.
  1372.  
  1373. CREATE        ; "name" --            FORTH-WORDLIST        CORE
  1374.     CREATE a new word "name" which at runtime returns the address of the
  1375. current end of data allocation. No data space is alloted.
  1376.  
  1377.     See >BODY ALLOT DOES>
  1378.  
  1379. CREATE-FILE    ; c-addr u x1 -- x2 ior (== 0 | system err)    FORTH-WORDLIST        FILE
  1380.     Create a file whose name is specified by c-addr u with access attributes x1.
  1381. Return x2 the file identifier and result of either 0 for success or the value returned
  1382. by the Win32 API call GetLastError() if not successful.
  1383.  
  1384.     See: BIN CLOSE-FILE DELETE-FILE OPEN-FILE R/O R/W  READ-FILE REPOSITION-FILE RESIZE-FILE WRITE-FILE
  1385.  
  1386. D+        ; ud|d1 ud|d2 -- ud|d3        FORTH-WORDLIST        DOUBLE
  1387.     ud|d3 is the sum of ud|d1 and ud|d2.
  1388.  
  1389. D-        ; ud|d1 ud|d2 -- ud|d3        FORTH-WORDLIST        DOUBLE
  1390.     ud|d3 is the difference of ud|d1 minus ud|d2.
  1391.  
  1392. D.        ; d --                FORTH-WORDLIST        DOUBLE
  1393.     Print the signed double d to the current output device in the current
  1394. number conversion base.
  1395.  
  1396. D=        ; xd1 xd2 -- flag        FORTH-WORDLIST        DOUBLE
  1397.     Flag is TRUE iff xd1 is bit-for-bit equal to xd2.
  1398.  
  1399. D>S        ; d1 -- n1            FORTH-WORDLIST        DOUBLE
  1400.     Convert the signed double-cell number d1 to the signed single n1. Silent
  1401. truncation occurs if d1 is to large to be represented in n1.
  1402.  
  1403. D0=        ; xd -- flag            FORTH-WORDLIST        DOUBLE
  1404.     flag is TRUE iff xd is 0.0
  1405.  
  1406. DABS        ; d -- ud            FORTH-WORDLIST        DOUBLE
  1407.     Returns the absolute value of d.
  1408.  
  1409. DATATOABS    ; data-addr -- abs-addr        SYSTEM-WORDLIST        ---
  1410.     Convert a data-relative address to an absolute address.
  1411.  
  1412. DATATOCODE    ; data-addr -- code-addr    SYSTEM-WORDLIST        ---
  1413.     Convert a data-relative address to a code-relative address.
  1414.  
  1415. DECIMAL     ; --                FORTH-WORDLIST        CORE
  1416.     Set the contents of BASE q.v. to 10r10.
  1417.  
  1418. DEFINITIONS    ; --                FORTH-WORDLIST        SEARCH
  1419.     Sets the current compilation wordlist to the first wordlist in the
  1420. search order.
  1421.     See: GET-ORDER ORDER SET-ORDER
  1422.  
  1423. DELETE-FILE    ; c-addr u -- ior (== 0 | system err)    FORTH-WORDLIST    FILE
  1424.     Delete a file whose name is specified by c-addr u with access attributes x1.
  1425. Return x2 the file identifier and result of either 0 for success or the value returned
  1426. by the Win32 API call GetLastError() if not successful.
  1427.  
  1428.     See: BIN CLOSE-FILE CREATE-FILE OPEN-FILE R/O R/W  READ-FILE REPOSITION-FILE RESIZE-FILE WRITE-FILE
  1429.  
  1430. DEPTH        ; i*x -- i*x i            FORTH-WORDLIST        CORE
  1431.     Return on the data stack the depth consumed currently on the data stack
  1432. prior to the execution of DEPTH.
  1433.  
  1434. DETOKEN     ; user-xt -- code-offset        INTERNALS-WORDLIST    ---
  1435.     Don't use this.
  1436.  
  1437. DIGIT        ; char n1 -- n2 true | char false    NONSTANDARD-WORDLIST    ---
  1438.      Return n2 and TRUE on the data stack if n2 is the value of the digit char
  1439. in base n1. Return the original char and FALSE if it is not a valid digit in base
  1440. n1.
  1441.  
  1442.     See >NUMBER NUMBER BASE
  1443.  
  1444. DNEGATE     ; d1 -- d2            FORTH-WORDLIST        CORE
  1445.     Signed double d2 is the negated value of signed double d1.
  1446.  
  1447. DO        ; -- do-dest            FORTH-WORDLIST        CORE
  1448. DOCONST     ; -- x              INTERNALS-WORDLIST    ---
  1449. DODLIT        ; --                 INTERNALS-WORDLIST    ---
  1450. DODO        ; u1 u2 --            INTERNALS-WORDLIST    ---
  1451. DODOES        ; -- x                INTERNALS-WORDLIST    ---
  1452. DODOTQUOTE    ; --                INTERNALS-WORDLIST    ---
  1453. DOELSE        ; --                INTERNALS-WORDLIST    ---
  1454. DOES>        ; --                FORTH-WORDLIST        CORE
  1455. DOIF        ; flag --             INTERNALS-WORDLIST    ---
  1456. DOKDOTQUOTE    ; --                INTERNALS-WORDLIST    ---
  1457.         Print strings stored in the kernel exe data section
  1458. DOKWORDLIST    ; -- a-addr            INTERNALS-WORDLIST    ---
  1459. DOLIT        ; -- x                INTERNALS-WORDLIST    ---
  1460. DOMARKER    ; -- a-addr            INTERNALS-WORDLIST    ---
  1461. DOLOOP        ; --                INTERNALS-WORDLIST    ---
  1462. DOPLUSLOOP    ; n1 --                INTERNALS-WORDLIST    ---
  1463. DOQDO        ; u1 u2 --            INTERNALS-WORDLIST    ---
  1464. DOSQUOTE    ; -- c-addr u            INTERNALS-WORDLIST    ---
  1465. DOUNTIL     ; flag --            INTERNALS-WORDLIST    ---
  1466. DOUNTILNOT    ; flag --            INTERNALS-WORDLIST    ---
  1467. DOWORDLIST    ; -- a-addr            INTERNALS-WORDLIST    ---
  1468. DP        ; -- a-addr            INTERNALS-WORDLIST    ---
  1469. DPL        ; -- a-addr            INTERNALS-WORDLIST    ---
  1470.  
  1471. DROP        ; x --                FORTH-WORDLIST        CORE
  1472.     Discard top data stack item.
  1473.  
  1474. DUM/MOD     ; d1 n1 -- n2 d2        NONSTANDARD-WORDLIST    ---
  1475.     Divides double d1 by n1 leaving double quotient d2 and modulus
  1476. n2.
  1477.  
  1478. DUMP        ; a-addr u --            FORTH-WORDLIST        TOOLS
  1479.     Formatted hex dump of memory starting from at least a-addr and
  1480. proceeding for at least u addresses. In Jax4th for Windows NT, the display
  1481. is by unicode characters, and Intel little-endian addresses are swapped in
  1482. pairs in the display to make character reading easier.
  1483.  
  1484. DUMPLINE    ; a-addr1 -- a-addr2
  1485.  
  1486. DUP        ; x -- x x            FORTH-WORDLIST    CORE
  1487.     Duplicate top data stack item.
  1488.  
  1489. EKEY        ; -- u                FORTH-WORDLIST    FACILITY EXT
  1490.     Return the value of the next keypress event. The 32-bit value returned
  1491. by Jax4th encoded as follows:
  1492.  
  1493.     Bits  0-15: The Unicode value (if any) of the key pressed.
  1494.     Bits 16-31: The Windows Virtual Key Code of the key pressed.
  1495.  
  1496.     For example, pressing the 'A' key on my keyboard with no shift or
  1497. capslock results in the hex value 00410061 where 0041 is the Windows Virtual
  1498. Key Code and 0061 ('a') is the Unicode value of the character resulting.
  1499. Pressing the <PgUp> key results in 00210000, a VKC of 0021 and no Unicode
  1500. character assigned.
  1501.  
  1502. ELSE        ; orig1 -- orig2        FORTH-WORDLIST    CORE
  1503.  
  1504. EMIT            ; char --        FORTH-WORDLIST    CORE
  1505. EMPTY-BUFFERS        ; --            FORTH-WORDLIST    BLOCK
  1506. ENABLE_ECHO_INPUT    ; -- x
  1507. ENABLE_LINE_INPUT    ; -- x
  1508. ENABLE_MOUSE_INPUT    ; -- x
  1509. ENABLE_PROCESSED_INPUT    ; -- x
  1510. ENABLE_WINDOW_INPUT    ; -- x
  1511. EVALUATE    ; i*x c-addr u -- j*x        FORTH-WORDLIST
  1512. ENVIRONMENT?    ; c-addr u -- false | i*x true    FORTH-WORDLIST
  1513. EXECUTE     ; i*x xt -- j*x            FORTH-WORDLIST
  1514. EXETOLINK    ; a-addr1 -- a-addr2
  1515. EXETONAME    ; a-addr -- c-addr
  1516.  
  1517. EXIT        ; --    R: nest-sys --        FORTH-WORDLIST
  1518.     Unnest from  the currently executing definition.
  1519.  
  1520. FALSE        ; -- flag            FORTH-WORDLIST
  1521.     Returns 0 on the data stack.
  1522.  
  1523. FERROR        ; -- a-addr            NONSTANDARD-WORDLIST
  1524.     Variable containing the last error reported by INCLUDE-FILE, if any.
  1525.  
  1526. FILE-POSITION    ; fileid -- ud ior (0= success , nz== last error    FORTH-WORDLIST    FILE
  1527.     Return the current offset in the file represented by fileid at
  1528. which or from which the next write or read will take place. This is a
  1529. deferred word and is vectored at startup to the Unicode version FILE-POSITIONW
  1530. in which ud is a number of characters. See REPOSITION-FILE
  1531.  
  1532. FILE-POSITIONA    ; fileid -- ud ior (0= success , nz== last error    NONSTANDARD-WORDLIST
  1533.     Ascii version of FILE-POSITION. ud is bytes.
  1534.  
  1535. FILE-POSITIONW    ; fileid -- ud ior (0= success , nz== last error    NONSTANDARD-WORDLIST
  1536.     Unicode version of FILE-POSITION. ud is widechars.
  1537.  
  1538. FILE-SIZE    ; fileid -- ud ior        FORTH-WORDLIST    FILE
  1539.     If ior returns zero, ud is the size of the file represented by fileid. This
  1540. is a deferred word and is vectored at startup to the Unicode version FILE-SIZEW.
  1541. See FILE-POSITION.
  1542.  
  1543. FILE-SIZEA    ; fileid -- ud ior        NONSTANDARD-WORDLIST
  1544.     Ascii version of FILE-SIZE. ud is bytes.
  1545.  
  1546. FILE-SIZEW    ; fileid -- ud ior        NONSTANDARD-WORDLIST
  1547.     Unicode version of FILE-SIZE. ud is widechars.
  1548.  
  1549. FILL        ; c-addr u char --        FORTH-WORDLIST
  1550. FIND        ; ( c-addr -- c-addr 0 | xt 1 | xt -1 )            FORTH-WORDLIST
  1551. FIRSTCATCH    ; --    R: -- catch-sys
  1552. FLUSH        ; --                FORTH-WORDLIST
  1553. FM/MOD        ; d1 n1 -- n2 n3        FORTH-WORDLIST
  1554.  
  1555. FORTH        ; --                FORTH-WORDLIST
  1556.     Makes the FORTH-WORDLIST the first wordlist in the dictionary search
  1557. order without deepening that search order.
  1558.     See also: FORTH-WORDLIST
  1559.  
  1560. FORTH-WORDLIST    ; -- wid            FORTH-WORDLIST
  1561.     Returns the wid representing the FORTH-WORDLIST.
  1562.     See also: FORTH WORDLIST
  1563.  
  1564. FreeLibrary    ; hLibModule --
  1565.     Frees the library module represendted by hLibModule which was previously
  1566. opened by the user via the Jax4th for NT word LoadLibraryEx (q.v.).
  1567.  
  1568. GET-CURRENT    ; -- wid            FORTH-WORDLIST
  1569.     Returns the wid representing the current compilation wordlist.
  1570.  
  1571. GET-ORDER    ; ( -- wid1 .. widn n)        FORTH-WORDLIST
  1572.     Returns the wordlist id's for all wordlists in the dictionary search order topped
  1573. with the number n of wordlists in the order (hence, the number of wid's below n on the stack).
  1574.  
  1575. GETCOMMANDLINE    ; -- c-addr u            SYSTEM-WORDLIST
  1576.     Returns Forth address and count of the command line with which Jax4th was invoked.
  1577.  
  1578. GetConsoleMode    ; -- LastErr | TRUE
  1579.     Instances the ConsoleMode variable and returns TRUE for success or the error code
  1580. returned by Win32's GetLastError() API if failed.
  1581.  
  1582. GetProcAddress    ; [lpszProc | ordinal] hModule -- abs-addr | nil
  1583.  
  1584.     Given the absolute address of a null-terminated ASCII string (See: ASCIIZ) and the handle to a library module,
  1585. performs the GetProcAddress call and returns either the absolute address of the named procedure or 0 indicating failure,
  1586. in which case the Forth variable LastError will hold the error code (if subsequently examined before any console I/O takes
  1587. place). Alternatively, the first parameter to this call may be the ordinal number of the desired routine, in which case
  1588. the upper 16 bits of such a number must be zeroes (0). Does no sanity checking on its parameters.
  1589.  
  1590. See: ASCIIZ FreeLibrary LoadLibraryEx SYSCALL
  1591.  
  1592. HEADER        ; c-addr u --            INTERNALS-WORDLIST
  1593.     Creates a name header, not linked in, from the string specified
  1594. by c-addr u.
  1595.  
  1596. HERE        ; -- addr            FORTH-WORDLIST
  1597.     Returns the next ALLOTable address in data space.
  1598.  
  1599. HEX        ; --                FORTH-WORDLIST
  1600.     Changes number conversion base to 16 (hexadecimal).
  1601.  
  1602. HLD        ; a-addr            NONSTANDARD-WORDLIST
  1603. HOLD        ; char --            FORTH-WORDLIST
  1604. I        ; -- n|u            FORTH-WORDLIST
  1605.     Returns the current inner loop index of a DO .. LOOP-type
  1606. construction.
  1607.  
  1608. IF        ; flag --            FORTH-WORDLIST    CORE
  1609.     At compile time, leaves an "origin" on the control flow stack.
  1610. At runtime, consumes a flag and branches to the corresponding ELSE or
  1611. THEN (if no ELSE) iff the flag is FALSE.
  1612.     
  1613. IMMEDIATE    ; --                FORTH-WORDLIST    CORE
  1614.     Renders the most recently defined colon definition IMMEDIATE, that
  1615. is, one which executes at compile time, rather than having its execution
  1616. appended to the definition under construction. IMMEDIATE must be executed
  1617. after the semicolon (";") of the colon definition in question, and before
  1618. any other additions or alterations to the dictionary are made.
  1619.  
  1620. INCLUDE-FILE    ; -- i*x fileid -- j*x        FORTH-WORDLIST    FILE
  1621.     Interpret the entire file represented by fileid. The user is responsible
  1622. for obtaining fileid via a call to OPEN-FILE, etc. If for any reason the
  1623. interpretation ABORTs or THROWs, there is no guarantee about the state of
  1624. the file pointer: it's best to close the file and re-open it before reloading.
  1625.  
  1626. INCLUDED    ; -- i*x c-addr u -- j*x    FORTH-WORDLIST    FILE
  1627.     Attempt to open and unterpret the entire file whose name is represented by
  1628. c-addr u.  If for any reason the interpretation ABORTs or THROWs, there is no guarantee
  1629. about the state of the file pointer.
  1630.  
  1631. INTERNALS-WORDLIST    ; -- wid        FORTH-WORDLIST
  1632.     Wordlist containing many implementation details of Jax4th.
  1633.  
  1634. INTERPRET    ; ( --)                INTERNALS-WORDLIST
  1635.  
  1636. INVALIDBLOCK    ; u -- flag            INTERNALS-WORDLIST
  1637.     flag is TRUE if u is not a valid BLOCK number in the file whose handle is
  1638. stored in BLOCK-FILE. If BLOCK- FILE's contents do not represent a valid file handle,
  1639. perform file i/o exception THROW -37. Used by BLOCK and REFILL.
  1640.  
  1641. INVERT        ; x1 -- x2            FORTH-WORDLIST CORE
  1642.     Reverses all bits of x1 yielding x2.
  1643.  
  1644. J        ; -- n|u            FORTH-WORDLIST CORE
  1645.     Sets compilation state.
  1646.  
  1647. KEY        ; -- char            FORTH-WORDLIST CORE
  1648.     Returns the next keypress from the standard character set.
  1649.  
  1650. KEY?        ; -- flag            FORTH-WORDLIST FACILITY
  1651.     Returns TRUE if a keypress is waiting in the range of 1Bh and
  1652. above, and also carriage return 0Dh.
  1653.  
  1654. LastError    ; -- a-addr            SYSTEM-WORDLIST
  1655.     Holds last error reported from I/O operation via Windows NT.
  1656.  
  1657. LEAVE        ; --    R: loop-sys --        FORTH-WORDLIST    CORE
  1658.     Clean off the loop stack and immediately LEAVE a loop.
  1659.  
  1660. LINKIT        ; --
  1661. LINKTOEXE    ; a-addr1 -- a-addr2
  1662. LINKTONAME    ; a-addr -- c-addr
  1663.  
  1664. LIST        ; u --                FORTH-WORDLIST    BLOCK EXT
  1665.     Display BLOCK u. A Forth file i/o THROW -37 will occur if the value in BLOCK-FILE is zero (0). A Block Read
  1666. THROW -33 will occur if the file handle in BLOCK-FILE is invalid. A Block Write THROW -34 will occur if an updated
  1667. buffer was waiting to be written but the operation failed. An invalid BLOCK number THROW -35 will occur if u is not
  1668. a valid BLOCK number in the BLOCK-FILE file.
  1669.  
  1670. LITERAL     ; x --            FORTH-WORDLIST
  1671.     Compile-only. Append the numeric literal x to the current definition.
  1672.  
  1673. LOAD        ; i*x u -- j*x        FORTH-WORDLIST
  1674.  
  1675.     Interpret BLOCK number u. A Forth file i/o THROW -37 will occur if the value in BLOCK-FILE is zero (0). A
  1676. Block Read THROW -33 will occur if the file handle in BLOCK-FILE is invalid. A Block Write THROW -34 will occur if
  1677. an updated buffer was waiting to be written but the operation failed. An invalid BLOCK number THROW -35 will occur
  1678. if u is not a valid BLOCK number in the BLOCK-FILE file.
  1679.  
  1680.     An attempt to perform 0 LOAD will invoke QUIT.
  1681.  
  1682. LoadLibraryEx    ; dwFlags 0 lpszLibFile -- hModule | 0
  1683.  
  1684.     Calls NT system to open the named module specified by the null-terminated Unicode string which is the third
  1685. parameter to this call. All S" strings are null-terminated, so their count may be dropped and the remaining address
  1686. passed to DATATOABS to provide this parameter. The other two parameters are, in order, the flag indicating whether
  1687. the initialization routine should be called for the library, and a reserved 0 parameter. See the Windows NT SDK for
  1688. further information on the call itself. Does no sanity checking on its parameters.
  1689.  
  1690.     The return is either the handle of the desired library module or a NULL for error, in which case the Forth variable
  1691. LastError will hold the error code (if subsequently examined before any console I/O takes place).
  1692.  
  1693. See: DATATOABS FreeLibrary S"
  1694.  
  1695. LOGIN        ; --
  1696. LOGOFF        ; --
  1697.  
  1698.  
  1699. LOOP        ; dest --            FORTH-WORDLIST CORE
  1700.     Resolves the backwards branch of a DO or ?DO.
  1701.  
  1702. LSHIFT        ; x1 u -- x2            FORTH-WORDLIST CORE
  1703.     Left-shifts x1 by u places leaving x2.
  1704.  
  1705. M*        ; n1 n2 -- d            FORTH-WORDLIST CORE
  1706.     Multiplies two signed singles returning a signed double.
  1707.  
  1708. MAKEDOES    ; xt --                INTERNALS-WORDLIST
  1709.     Lays down the execution for a DOES> word. Don't use this word.
  1710.  
  1711. MAKETOKEN    ; code-offset -- user-xt    INTERNALS-WORDLIST
  1712.     Creates an execution token from an offset. Don't use this word.
  1713.  
  1714. MARKER        ; "name" --            FORTH-WORDLIST    CORE EXT
  1715.     Create a "forgettable" word which, when executed, restores the
  1716. dictionary to the precise state it was in before the MARKER word was
  1717. defined. Also unallots all data space that was alloted prior to the
  1718. MARKER word being defined, though this effect is not guaranteed in
  1719. the Standard. No checking for outstanding references to deleted
  1720. structures, e.g., disappearing wordlists in the search order, is
  1721. provided.
  1722.  
  1723. MAX        ; n1 n2 -- n3            FORTH-WORDLIST    CORE
  1724.     n3 is the signed maximum of n1 n2.
  1725.  
  1726. MIN        ; n1 n2 -- n3            FORTH-WORDLIST    CORE
  1727.     n3 is the signed minimum of n1 n2.
  1728.  
  1729. MOVE        ; addr1 addr2 u --        FORTH-WORDLIST    CORE
  1730.     Move the contents of u address units from the region starting at addr1 to the
  1731. region starting at addr2. Copy in the correct order to prevent replication in case of
  1732. overlapping memory regions.
  1733.  
  1734. NAMEWORDLIST    ; c-addr u -- wid        NONSTANDARD-WORDLIST
  1735.     Create a wordlist whose name will show in the ORDER dump of wordlist names. The name
  1736. is specified by c-addr u. NAMEWORDLIST is a convenience and not a Standard feature, nor
  1737. are NAMEWORDLIST constructions non-standard, unless a program depends on their name being
  1738. usable. Think of it as a debugging convenience.
  1739.  
  1740.     Named wordlists created by NAMEWORDLIST  are no different in
  1741. their internal structure than a wordlist created by WORDLIST (q.v.). The only
  1742. difference is that a NAMEWORDLIST has a regular Forth name header and a
  1743. WORDLIST is created with a header that tells the Jax4th interpreter that
  1744. it is a "headerless" item in the dictionary.
  1745.  
  1746. NAMETOEXE    ; c-addr -- a-addr
  1747. NAMETOLINK    ; c-addr -- a-addr
  1748.  
  1749. NEGATE        ; n1 -- n2            FORTH-WORDLIST    CORE
  1750.     n2 is n1 negated.
  1751.  
  1752. NEST        ; --    R: -- sys        SYSTEM-WORDLIST
  1753.     This is the nesting engine of the Forth interpreter. Don't use this word!
  1754.  
  1755. NIP        ; x1 x2 -- x2            FORTH-WORDLIST    CORE EXT
  1756.     Remove the second data stack entry.
  1757.  
  1758. NONSTANDARD-WORDLIST    ; -- wid
  1759.     Wordlist containing nonstandard but generally useful Jax4th words.
  1760.  
  1761. NOOP        ; --
  1762.     Does nothing but waste a few CPU cycles.
  1763.  
  1764. NUMBER        ; c-addr1 u1 -- d TRUE | x x FALSE
  1765.     Converts the string at c-addr1 u1 to a double-cell number in the current
  1766. number base. Correctly handles sign and embedded decimal point. Returns false
  1767. if unconvertible characters were encountered.
  1768.  
  1769. okPrompt    ; --
  1770.  
  1771. ONLY        ; --                FORTH-WORDLIST    SEARCH EXT
  1772.     Sets the minimum search order, consisting in the case of
  1773. Jax4th of the FORTH-WORDLIST alone.
  1774.  
  1775. OPEN-FILE    ; c-addr u x1 -- x2 ior (== 0 | system err)    FORTH-WORDLIST
  1776.  
  1777. OR        ; x1 x2 -- x3                FORTH-WORDLIST
  1778.     x3 is the bitwise OR of x1 and x2.
  1779.  
  1780. ORDER        ; --                    FORTH-WORDLIST
  1781.     Displays the dictionary search order and the compilation wordlist.
  1782.  
  1783. OVER        ; x1 x2 -- x1 x2 x1            FORTH-WORDLIST
  1784.     Copies data stack item x1 to top of stack.
  1785.  
  1786. PAD        ; -- c-addr                FORTH-WORDLIST
  1787.     Returns the character-aligned address of a scratch buffer. No
  1788. system words use this buffer, but its persistence is not guaranteed across
  1789. dictionary operations.
  1790.  
  1791. PAGE        ; --                    FORTH-WORDLIST    FACILITY
  1792.     Advance the output device by one "page", e.g., clear the screen
  1793. most of the time.
  1794.  
  1795. PARSE        ; ( char "ccc<char>" -- c-addr u)    FORTH-WORDLIST
  1796.  
  1797. PICK        ; xu .. x1 x0 u -- xu .. x1 x0 xu    FORTH-WORDLIST    CORE EXT
  1798.     Copy the u'th data stack item to top of data stack.
  1799.  
  1800. PLACE        ; c-addr1 u c-addr2            NONSTANDARD-WORDLIST
  1801.     An old favorite. Copy the counted string specified by c-addr1 u
  1802. to c-addr2.
  1803.  
  1804. POSTPONE    ; "name" --                FORTH-WORDLIST
  1805. PREVIOUS    ; --                    FORTH-WORDLIST
  1806. QUIT        ; ( --) ( R: i*x --)            FORTH-WORDLIST
  1807. R>        ; -- x    R: x --                FORTH-WORDLIST
  1808. R@        ; -- x    R: x -- x            FORTH-WORDLIST
  1809. R/O        ; -- x                    FORTH-WORDLIST
  1810. R/W        ; -- x                    FORTH-WORDLIST
  1811.  
  1812. READ-FILE    ; c-addr u1 fileid -- u2 ior (== 0 | system err)    FORTH-WORDLIST    FILE
  1813.     Read u1 units to c-addr from file described by fileid. This
  1814. is a deferred word and is vectored at startup to the Unicode version
  1815. READ-FILEW.
  1816.  
  1817.     See WRITE-FILE
  1818.  
  1819. READ-FILEA    ; c-addr u1 fileid -- u2 ior (== 0 | system err)    NONSTANDARD-WORDLIST
  1820.     ASCII version of READ-FILE.
  1821.  
  1822. READ-FILEW    ; c-addr u1 fileid -- u2 ior (== 0 | system err)    NONSTANDARD-WORDLIST
  1823.     Unicode version of READ-FILE.
  1824.  
  1825. RECURSE     ; --                    FORTH-WORDLIST    CORE EXT
  1826.     Append to the current definition under construction a runtime call to the head
  1827. of that same definition. For example, the definition 
  1828.  
  1829.     : TILL-ZERO ( n -- 0) DUP 0> IF 1- RECURSE ELSE DUP 0< IF 1+ RECURSE THEN THEN ;
  1830.  
  1831. will turn any number to zero, providing the return stack doesn't overflow first with
  1832. the level of nesting (one entry per recursive call).
  1833.  
  1834. REFILL        ; -- flag                FORTH-WORDLIST    CORE, BLOCK
  1835.     Get another input buffer full of input, return TRUE for success and 0 for failure.
  1836. If BLK is zero (0) this is a request for another line of input from the user.
  1837. If BLK is non-zero, REFILL effectively means BLK @ 1+ LOAD.
  1838.  
  1839. RELOAD        ; "ccc< >" -- ior            SYSTEM-WORDLIST
  1840.     Parse a filename and open it as a saved user image and reload it.
  1841.  
  1842.     NOTE!!! Use only on the command shell command line when invoking Jax4th, because
  1843. RELOAD continues parsing the input stream. If you use it from within the Forth interpreter,
  1844. there will be "stuff" left in the restored terminal input buffer, which probably won't be
  1845. what you meant to interpret.
  1846.  
  1847.     For reloading a user image from within Jax4th itself, use RELOAD-FILE or RELOADED, q.v.
  1848.  
  1849. RELOAD-FILE    ; i*x fid -- j*x u ior            SYSTEM-WORDLIST
  1850.     Reload the file specificed by fid as a user image. This will be the last word parsed
  1851. and executed on the Forth input line in which it is found interpretively, as images are saved
  1852. with the input specification set to an empty TIB.
  1853.  
  1854.     The returns from RELOAD-FILE are the bytes (not chars) read in the file read operation,
  1855. and the ioresult from the file read operation.
  1856.  
  1857.     To reload an image and then execute a command, compile RELOAD-FILE into a definition
  1858. and then execute that definition.
  1859.  
  1860.     See also: RELOAD RELOADED
  1861.  
  1862. RELOADED    ; c-addr u -- u ior1 ior2            SYSTEM-WORDLIST
  1863.     Reload the file whose name is specified by c-addr u as a user image. This will be the
  1864. last word parsed and executed on the Forth input line in which it is found interpretively, as
  1865. images are saved with the input specification set to an empty TIB.
  1866.  
  1867.     The returns from RELOADED are the bytes (not chars) read in the file read operation,
  1868. the ioresult from the file read operation, and ioresult from the file close operation.
  1869.  
  1870.     To reload an image and then execute a command, compile RELOADED into a definition
  1871. and then execute that definition.
  1872.  
  1873.     See also: RELOAD-FILE RELOAD
  1874.  
  1875. REPEAT        ; orig dest --                FORTH-WORDLIST    CORE
  1876.     Consume an orig and dest from the control flow stack and use them to calculate and
  1877. fix up the information provided and required by the providers of orig and dest. dest is the
  1878. point to which the REPEAT will branch back when encountered at runtime. orig is the information
  1879. for the position and which branch information for the execution cell beyond the REPEAT is located
  1880. for a forward-branching test.
  1881.  
  1882.     See: AGAIN BEGIN UNTIL WHILE
  1883.  
  1884. REPOSITION-FILE    ; ud fileid -- ior ( == 0 | system err)    FORTH-WORDLIST    FILE
  1885.     Move file pointer to position ud in file described by fileid. This
  1886. is a deferred word and is vectored at startup to the Unicode version
  1887. REPOSITION-FILEW.
  1888.  
  1889.     See FILE-POSITION
  1890.  
  1891. REPOSITION-FILEA    ; ud fileid -- ior ( == 0 | system err)    NONSTANDARD-WORDLIST
  1892.     ASCII version of REPOSITION-FILE.
  1893.  
  1894. REPOSITION-FILEW    ; ud fileid -- ior ( == 0 | system err)    NONSTANDARD-WORDLIST
  1895.     Unicode version of REPOSITION-FILE.
  1896.  
  1897. RESIZE-FILE    ; ud fileid -- ior ( == 0 | system err)    FORTH-WORLDIST    FILE
  1898.     Resize the file represented by fileid to the size ud. The contents of
  1899. any previously unwritten extent if the file size is thus increased are undefined.
  1900. This is a deferred word and is vectored at startup to the Unicode version
  1901. REPOSITION-FILEW.
  1902. See FILE-SIZE
  1903.  
  1904. RESIZE-FILEA    ; ud fileid -- ior ( == 0 | system err)    NONSTANDARD-WORDLIST
  1905.     ASCII version of RESIZE-FILE.
  1906.  
  1907. RESIZE-FILEW    ; ud fileid -- ior ( == 0 | system err)    NONSTANDARD-WORDLIST
  1908.     Unicode version of RESIZE-FILE.
  1909.  
  1910. RESTORE-CON    ; x1 .. xn --                INTERNALS-WORDLIST
  1911.     Restore certain Console session items saved by SAVE-CON, q.v.
  1912.  
  1913. RESTORE-INPUT    ; xn .. x1 n     --            FORTH-WORDLIST    CORE EXT
  1914.     Restore the input specification from the items deposited on the data stack
  1915. by SAVE-INPUT, q.v.
  1916.  
  1917. ROT        ; x1 x2 x3 -- x2 x3 x1            FORTH-WORDLIST    CORE
  1918.     Rotate third-on-data-stack to first-on-data-stack.
  1919.  
  1920. RP!        ; addr --                FORTH-WORDLIST
  1921.  
  1922. RP@        ; -- addr                FORTH-WORDLIST
  1923.  
  1924. RSHIFT        ; x1 u -- x2                FORTH-WORDLIST    CORE
  1925.     Shift x1 right by u places, filling in zeroes to the left.
  1926.  
  1927. S"        ; Interp: "ccc<"> -- c-addr u    Compile: -- "ccc<"> Execute: -- c-addr u    FORTH-WORDLIST
  1928.     S" parses up to the next delimiting double-quote character. If interpreting, S" places the result in a temporary
  1929. buffer and places the string address and its count on the stack. The buffer itself is overwritten by the next occurence of
  1930. an interpretive S". If compiling, S" aligns data space, then allots data space and moves the parsed string into that
  1931. alloted space, then appends to the current definition the code to place the address and count of the string on the stack at
  1932. runtime. Not included in the count in either case is a null terminator appended to make interfacing with the NT system
  1933. easier.
  1934.  
  1935.     The size of the temporary buffer used for interpretive S" is 256 characters. Since one character is used for the
  1936. string count, and one character is used for the null pad, the maximum string length for interpretive S" is 254 characters.
  1937. If this count is exceeded, the buffer will overflow silently into data space, with undefined results.
  1938.  
  1939.     The size of a compiled S" string is limited to (2^16)-1 characters, or the size of remaining data space, whichever
  1940. is less. If the string exceeds this size, the results are undefined.
  1941.  
  1942. S>D        ; n1 -- d1                FORTH-WORDLIST    CORE
  1943.     Convert signed single n1 to signed double d1 on the data stack.
  1944.  
  1945. SAVE-BUFFERS    ; --                    FORTH-WORDLIST    BLOCK
  1946.      Write all UPDATEd block buffers to disk.
  1947.     A Forth file i/o THROW -37 will occur if the value in BLOCK-FILE is zero (0). A Block Read
  1948. THROW -33 will occur if the file handle in BLOCK-FILE is invalid. A Block Write THROW -34 will occur if an updated
  1949. buffer was waiting to be written but the operation failed. An invalid BLOCK number THROW -35 will occur if u is not
  1950. a valid BLOCK number in the BLOCK-FILE file.
  1951.  
  1952.  
  1953. SAVE-CON    ; -- x1 .. xn                INTERNALS-WORDLIST
  1954.     Save certain Console session items for later restore by RESTORE-CON, q.v.
  1955.  
  1956. SAVE-FORTH    ; -- 0|ior                NONSTANDARD-WORDLIST
  1957.     Brings up a requester for a file name to save the current image of the user dictionary and
  1958. data space. Returns 0 if successful, or an I/O error code ior if failed. If ior is non-zero and
  1959. matches the value of LastError (if read in an atomic operation with SAVE-FORTH ... LastError
  1960. is altered by Console I/O), then ior is a return from the file open or write operation. If ior
  1961. doesn't match LastError read in an atomic operation with SAVE-FORTH then ior is the return from
  1962. GetCmdDlgExtendedError() and the file requester dialog failed.
  1963.  
  1964.     SAVE-FORTH or any word containing SAVE-FORTH is the last word parsed on the line in which
  1965. it is encountered by the interpreter. If any processing is desired at the same time as SAVE-FORTH
  1966. then SAVE-FORTH should be compiled into a higher-level word.
  1967.  
  1968.     See: RELOAD RELOAD-FILE RELOADED
  1969.  
  1970. SAVE-INPUT    ; -- xn .. x1 n                FORTH-WORDLIST    CORE EXT
  1971.     Save items representing the current input specification on the stack topped by the
  1972. number of items thus saved. Input specification can be restored by RESTORE-INPUT, q.v.
  1973.  
  1974.  
  1975. SAVEDEPTH    ; i*x -- i*x                INTERNALS-WORDLIST
  1976. SCAN        ; ( c-addr1 u1 char --- c-addr2 u2)    NONSTANDARD-WORDLIST
  1977.  
  1978. SCR        ; -- a-addr                FORTH-WORDLIST
  1979. SEARCH-WORDLIST ; c-addr u wid -- 0 | xt 1 | xt -1)    FORTH-WORDLIST
  1980. SET-CURRENT    ; wid --                FORTH-WORDLIST
  1981. SET-ORDER    ; wid1 .. widn n --            FORTH-WORDLIST
  1982. SetConsoleMode    ; -- LastErr | TRUE
  1983. SIGN        ; n --                    FORTH-WORDLIST
  1984.  
  1985. SKIP        ; ( c-addr1 u1 char --- c-addr2 u2)    NONSTANDARD-WORDLIST
  1986.     Index through c-addr1 u1 until the first character not matching char
  1987. is found. Return the remaining string.
  1988.  
  1989. SLITERAL    ; c-addr1 u    Execution: -- c-addr2 u    FORTH-WORDLIST    STRING
  1990. SM/REM        ; d1 n1 -- n2 n3            FORTH-WORDLIST
  1991. SOURCE        ; -- c-addr u                FORTH-WORDLIST
  1992. SOURCE-ID    ; -- a-addr                FORTH-WORDLIST
  1993. SP!        ; abs-addr --
  1994. SP0        ; -- a-addr
  1995. SP@        ; -- abs-addr
  1996. SPACE        ; --                    FORTH-WORDLIST
  1997. SPACES        ; n --                    FORTH-WORDLIST
  1998. STATE        ; -- a-addr                FORTH-WORDLIST
  1999. STATEABORT    ; --
  2000. StdErr        ; -- a-addr
  2001. StdIn        ; -- a-addr
  2002. StdOut        ; -- a-addr
  2003. SYSTEM-WORDLIST    ; -- wid
  2004.  
  2005. SWAP        ; x1 x2 -- x2 x1            FORTH-WORDLIST    CORE
  2006.     Exchange top two data stack items.
  2007.  
  2008. SYSCALL        ; abs-addr -- edx eax
  2009.  
  2010.     Performs a call to abs-addr and returns, pushing EDX and EAX which are used by DLL calls for returns. Does no
  2011. sanity checking on stack or on abs-addr.
  2012.  
  2013. THEN        ; --                    FORTH-WORDLIST
  2014.     At compile time, consume an "origin" from the control-flow stack. At runtime,
  2015. do nothing but serve as the exit point from a control flow construct in which THEN is
  2016. appropriate.
  2017.  
  2018. THROW        ; k*x n -- k*x | i*x n            FORTH-WORDLIST    EXCEPTION
  2019. THRU        ; i*x u1 u2 -- j*x            FORTH-WORDLIST
  2020. TIB        ; -- c-addr                FORTH-WORDLIST
  2021. TOKENTODATA    ; linkt|xt -- a-addr            IMPLEMENTATION-WORDLIST
  2022.  
  2023. TRUE        ; -- flag                FORTH-WORDLIST
  2024.  
  2025. TUCK        ; x1 x2 -- x2 x1 x2            FORTH-WORDLIST
  2026.  
  2027. TYPE        ; c-addr u --                FORTH-WORDLIST
  2028.  
  2029. U.        ; u --                    FORTH-WORDLIST
  2030.  
  2031. U.R        ; u n --                NONSTANDARD-WORDLIST
  2032.  
  2033. U<        ; u1 u2 -- flag                FORTH-WORDLIST
  2034.  
  2035. UD*U        ; ud1 u1 -- ud2                NONSTANDARD-WORDLIST
  2036.  
  2037. UD.        ; ud --                    NONSTANDARD-WORDLIST
  2038.  
  2039. UD.R        ; ud n --                NONSTANDARD-WORDLIST
  2040.  
  2041. UD<        ; ud1 ud2 -- flag            NONSTANDARD-WORDLIST
  2042.     flag is TRUE iff ud2 is greater unsigned than ud1.
  2043.  
  2044. UDMIN        ; ud1 ud2 -- ud1|ud2            NONSTANDARD-WORDLIST
  2045.     Returns the minimum of two unsigned double numbers.
  2046.  
  2047. UM*        ; u1 u2 -- ud                FORTH-WORDLIST    CORE
  2048.  
  2049. UM/MOD        ; ud u1 -- u2 u3            FORTH-WORDLIST    CORE
  2050.     u3 is the quotient and u2 the modulus of unsigned division performed
  2051. on ud2 by u1.
  2052.  
  2053. UNFOUND     ; --
  2054.  
  2055. UNICODE        ; b-addr u -- addr
  2056.     Copies an ASCII string specified by c-addr u as a null-terminated UNICODE string into a system buffer whose
  2057. address is then returned. This system buffer is overwritten each time ASCIIZ is called. The buffer is 128 Unicode
  2058. characters long, and the null terminator will use up one of these character addresses, so the maxiumum value for the
  2059. argument  u  is thus 127.
  2060.  
  2061. UNLOOP        ; --    R: loop-sys --        FORTH-WORDLIST        CORE
  2062.     Clear the loop stack of the data for the innermost enclosing loop.
  2063.  
  2064. UNNEST        ; -- x    R: nest-sys --        NONSTANDARD-WORDLIST
  2065.     Same as EXIT.
  2066.  
  2067. UNRESOLVED    ; --
  2068.  
  2069. UNTIL        ; dest --            FORTH-WORDLIST
  2070.  
  2071. UPDATE        ; --                FORTH-WORDLIST
  2072.     Cause the most-recently-accessed BLOCK buffer to be marked
  2073. as updated, causing it to be written to disk on the next SAVE-BUFFERS
  2074. or FLUSH operation, or when the buffer is reused.
  2075.  
  2076. USERTOKEN?    ; xt -- flag            INTERNALS-WORDLIST
  2077.     Returns TRUE if xt is an execution token of a type matching
  2078. those for a user-defined word.
  2079.  
  2080. VARIABLE    ; "name" --            FORTH-WORDLIST
  2081.     Create a variable named "name" which at runtime will
  2082. push its data address on the data stack.
  2083.  
  2084.  
  2085. W/O        ; -- x                FORTH-WORDLIST
  2086.     Used with OPEN-FILE q.v. to signify write-only access.
  2087.  
  2088. WORDLIST    ; -- wid            FORTH-WORDLIST    SEARCH
  2089.     Create a wordlist to which dictionary entries may be appended,
  2090. and which may be placed in the search order. Jax4th for Windows NT also
  2091. provides a mechanism whereby named wordlists may be created, for user
  2092. convenience, although this is not a standard feature.
  2093.  
  2094.     Here we will discuss the internal structure of a wordlist in
  2095. Jax4th. These are not standard issues: this is merely the way Jax4th
  2096. implements wordlists. The fact that the wordlist we will examine for
  2097. an example happens to be a named wordlist is not important in this context.
  2098.  
  2099.     First of all, a wordslist's "wid" (wordlist identifier, the
  2100. stack entry representing a wordlist) is a data address representing
  2101. an address in user code space.  By placing the wid of FORTH-WORDLIST
  2102. (a Standard wordlist) on the stack and doing a dump some address units
  2103. back, we (coincidentally) find the header in the dictionary and all
  2104. the rest of the information stored for the FORTH-WORDLIST except the
  2105. pointer to the last entry in the wordlist.
  2106.  
  2107. HEX ok
  2108. FORTH-WORDLIST 20 - 20 DUMP
  2109.  
  2110. Address  0100 0302 0504 0706 0908 0B0A 0D0C 0F0E Unicode
  2111. 002C2210 FFFF 000E 0046 004F 0052 0054 0048 002D  .FORTH-
  2112. \             ^count  ^name field
  2113. 002C2220 0057 004F 0052 0044 004C 0049 0053 0054 WORDLIST
  2114. \         ^rest of name field (remember this is unicode)
  2115. 002C2230 1118 0040 0038 0000 0000 0000 37AC 0040 .@8...¼@
  2116. \        ^execution ^pointer   ^back     ^link pointer to next
  2117. \         engine     to thread  pointer   word in dictionary
  2118.                                 to previous
  2119.                                 wordlist
  2120.  ok
  2121.  
  2122.     (The actual addresses are specific to the revision of Jax4th from
  2123. which the example was taken.)
  2124.  
  2125.     We see that in the example, FORTH-WORDLIST has its name count starting
  2126. at 2c2210 (the FFFF is a marker in a Jax4th count field). The count is Oe (14)
  2127. characters: FORTH-WORDLIST. The execution engine for FORTH-WORDLIST has a token
  2128. of 00401118 (remember, this is Intel architecture). After the execution engine
  2129. is a pointer to data space where the thread pointer is located. The thread
  2130. pointer points to the most recently defined word in this wordlist. Following
  2131. the thread pointer is a back pointer to the previous wordlist which had been
  2132. the last defined wordlist at the time that FORTH-WORDLIST was defined. In this
  2133. case that pointer is 00000000 since the FORTH-WORDLIST was the first wordlist
  2134. defined. Had there been a link there, it would have been an absolute address
  2135. of the wordlist link pointer in the previous wordlist. After that, we see that
  2136. the DUMP display includes coincidentally the link pointer for the next entry
  2137. in the dictionary, whatever that happens to be, but this has no signficance
  2138. to our discussion of wordlists or the FORTH-WORDLIST.
  2139.  
  2140.     Named wordlists created by NAMEWORDLIST (q.v.) are no different in
  2141. their internal structure than a wordlist created by WORDLIST. The only
  2142. difference is that a NAMEWORDLIST has a regular Forth name header and a
  2143. WORDLIST is created with a header that tells the Jax4th interpreter that
  2144. it is a "headerless" item in the dictionary.
  2145.  
  2146. WORDLISTS    ; --
  2147.     Displays all wordlists in the system, both system and user wordlists.
  2148. In the example below, there are four (4) system wordlists, one anonymous
  2149. user wordlist (the "normal" kind of wordlist) and a NAMEWORDLIST called
  2150. ARFARF.
  2151.  
  2152. WORDLISTS
  2153.  
  2154. Wordlists:
  2155. FFFF0030 named ARFARF
  2156. FFFF0010 named
  2157.   2C22D8 named SYSTEM-WORDLIST
  2158.   2C22A4 named NONSTANDARD-WORDLIST
  2159.   2C2268 named INTERNALS-WORDLIST
  2160.   2C2230 named FORTH-WORDLIST
  2161.  ok
  2162.  
  2163. WHILE        ; flag --        FORTH-WORDLIST    CORE
  2164.     At compile time, take a "dest" and replace it with an "orig dest"
  2165. pair on the control flow stack for later resolution, e.g., by REPEAT (q.v.).
  2166.  
  2167.     At runtime, consume a flag and iff false, branch away just past
  2168. corresponding REPEAT.
  2169.  
  2170. WITHIN        ; n|u1 n|u2 n|u3 -- flag            FORTH-WORDLIST    CORE EXT
  2171.  
  2172. WORD        ; ( char "ccc<char>" -- c-addr)            FORTH-WORDLIST    CORE
  2173.  
  2174. WRITE-FILE    ; c-addr u fileid -- ior (== 0 | system err)    FORTH-WORDLIST    FILE
  2175.     Write u characters starting from c-addr to the file represented by fileid.
  2176. Returns Windows NT LastError or 0 for success. This is a deferred word and is vectored
  2177. at startup to the Unicode version WRITE-FILEW.
  2178. See READ-FILE
  2179.  
  2180. WRITE-FILEA    ; c-addr u fileid -- ior (== 0 | system err)    NONSTANDARD-WORDLIST
  2181.     ASCII version of WRITE-FILE.
  2182.  
  2183. WRITE-FILEW    ; c-addr u fileid -- ior (== 0 | system err)    NONSTANDARD-WORDLIST
  2184.     Unicode version of WRITE-FILE.
  2185.  
  2186. XOR        ; x1 x2 -- x3                    FORTH-WORDLIST    CORE
  2187.     x3 is the bitwise exclusive-or of x1 x2.
  2188.  
  2189. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  2190. ~ End of JAX4TH.DOC        ~
  2191. ~    Jack Woehr        ~
  2192. ~    Golden, Colorado    ~
  2193. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  2194.  
  2195.